批判我的原型继承模式 - ver2
Critique my prototypal inheritance pattern - ver2
我的 的后续行动 - 我的目标是避免使用构造函数并创建一个模式,让我可以 轻松继承功能 。
以下代码继承任意数量的对象。 construct() 函数,使用 Object.create() 将所有继承的对象放置到原型上,然后用传入的属性实例化对象;可选地,您可以传入在对象上下文中调用的其他函数。
作为内务处理,init 函数会删除自身,因此您最终会得到一个干净的对象,即 obj.props 然后所有继承的 functions/props 都驻留在第一个原型链上.通常,当级联链式继承时,您最终会得到一个多级 _proto__ 链,但在这里它们都位于第一个 link,因此编译器有一些查找速度优势。
再次欢迎您的反馈...
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);
我的
以下代码继承任意数量的对象。 construct() 函数,使用 Object.create() 将所有继承的对象放置到原型上,然后用传入的属性实例化对象;可选地,您可以传入在对象上下文中调用的其他函数。
作为内务处理,init 函数会删除自身,因此您最终会得到一个干净的对象,即 obj.props 然后所有继承的 functions/props 都驻留在第一个原型链上.通常,当级联链式继承时,您最终会得到一个多级 _proto__ 链,但在这里它们都位于第一个 link,因此编译器有一些查找速度优势。
再次欢迎您的反馈...
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);