批判我的原型继承模式 - ver2

Critique my prototypal inheritance pattern - ver2

我的 的后续行动 - 我的目标是避免使用构造函数并创建一个模式,让我可以 轻松继承功能

以下代码继承任意数量的对象。 construct() 函数,使用 Object.create() 将所有继承的对象放置到原型上,然后用传入的属性实例化对象;可选地,您可以传入在对象上下文中调用的其他函数。

作为内务处理,init 函数会删除自身,因此您最终会得到一个干净的对象,即 obj.props 然后所有继承的 functions/props 都驻留在第一个原型链上.通常,当级联链式继承时,您最终会得到一个多级 _proto__ 链,但在这里它们都位于第一个 link,因此编译器有一些查找速度优势。

再次欢迎您的反馈...

jsfiddle

var Vehicle = {
    colour : 'blue',
    info   : function() { console.log('wheels:' + this.wheels + ' colour:' + this.colour); }
};

var Car = {
    wheels : 4,
    drift  : function() { console.log('drifting'); }
};

var Bike = {
    wheels : 2,
    wheelie : function() { console.log('stunt riding'); }
};

var ferrari = construct( $.extend({}, Vehicle, Car),  {colour:'red'} ); 
var yamaha  = construct( $.extend({}, Vehicle, Bike) ); 

ferrari.drift(); // difting
ferrari.info(); // wheels:4 colour:red
yamaha.wheelie(); // stunt riding
yamaha.info(); // wheels:2 colour:blue

/*
    construct(proto, props, funcs)
    sets prototype functions from inherited classes
    invokes any functions passed
*/

function construct(proto, props, funcs)
{
    return Object.create(proto, {

        init : { value : function() {

            $.extend(this, props);
            if (funcs) for (var i=0; i<funcs.length; i++) funcs[i].call(this);
            delete this.init;

            return this;

        }, configurable : true } // used to delete init prop from object

    }).init(); 
}

继承不会生效,您将拥有多个属性副本。

相反,我推荐 Object.create:

的正常继承
var vehicle = {
  colour: 'blue',
  info: function() {
    console.log('wheels:' + this.wheels + ' colour:' + this.colour);
  }
};
var car = Object.assign(Object.create(vehicle), {
    wheels: 4,
    drift: function() { console.log('drifting'); }
});
var bike = Object.assign(Object.create(vehicle), {
    wheels: 2,
    wheelie: function() { console.log('stunt riding'); }
});
var ferrari = Object.assign(Object.create(car), {colour:'red'} ); 
var yamaha  = Object.create(bike);