オブジェクトを他のオブジェクトで拡張できる関数を作成しています
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 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> のもう少し詳細なバージョンです。