我正在构建一个允许对象被任何其他对象扩展的函数
Object.prototype.extend = function(constructor, args) {
var proto = this;
while(proto.__proto__.constructor !== Object) {
proto = proto.__proto__
}
proto.__proto__ = new constructor(args)
console.log(this);
}
该方法将像这样调用:
function ChildModelConstructor(1,2,3) {
this.extend(ParentModel, arguments)
}
or
instanceOfChildModel.extend(ParentModel, [1,2,3])
问题是如果我这样调用 new :
new constructor(args)
父对象的构造函数接收参数,该参数是参数对象或数组。
我想要的是能够打电话
new constructor.apply(args)
或类似的东西,我不想改变这个新的上下文,apply 是使用我知道的 args 对象或数组调用方法的唯一方法。
谢谢您的帮助 :)
更新,我找到了更好的方法
这是我想出的一种更好的继承方法,它避免使用折旧的原型
与我发现的其他继承方案相比,这种方法有几个优点。最大的是它没有合并多个级别的原型链。许多方案将 childClass 的 proto 方法与父类实例变量混合在一起,或者更糟糕的是,将父类初始化的所有方法和属性直接放入 childClass 的主体中。
缺点是,它是单继承,并且不能更改单个实例的继承,因为原型属性属于构造函数。
Function.prototype.inherit = function(parentClass) {
var newPrototype = Object.create(Object.create(parentClass.prototype));
for(key in this.prototype){
newPrototype[key] = this.prototype[key];
}
this.prototype = newPrototype;
this.prototype.constructor = this;
this.prototype.parentClass = parentClass;
this.prototype.initParent = function(args) {
var proto = Object.getPrototypeOf(Object.getPrototypeOf(this))
this.parentClass.apply(proto, args);
}
this.prototype.uber = function() {
return Object.getPrototypeOf(Object.getPrototypeOf(this));
}
}
你可以像这样设置继承:
function Model(n) {
this.initParent(arguments)
this.test = n*2;
}
Model.inherit(BaseClass);
这里是 JSFiddle 中稍微详细一点的版本http://jsfiddle.net/michaelghayes/2rHgK/ </p>