2

オブジェクトを他のオブジェクトで拡張できる関数を作成しています

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> のもう少し詳細なバージョンです。

4

2 に答える 2

0

これはテストされていませんが、うまくいくと思います。交換:

proto.__proto__ = new constructor(args)

と:

proto.__proto__ = {};
proto.__proto__.prototype = constructor.prototype;
constructor.apply(proto.__proto__, args);

__proto__非推奨になっていることに注意してください。

于 2012-05-20T23:18:11.930 に答える
0

オブジェクトのプロトタイプに物を添付せず、継承を手動で設定する方がよいでしょう。

Model function() {
  //init parent first because of chromes hidden classes
  ParentClass.apply(this, [].slice.call(arguments))
  //new instance properties
  this.something = 'something'
}

Model.prototype = Object.create(ParentClass.prototype, {
  constructor: {value: Model}
})

//Prototype props
Model.prototype.whatever = function(){return 'whatever'}

これにより、親を初期化する前に引数を変更することもできます。これは、新しいクラスがその親とまったく同じ引数の使用に制限されるべきではないためです。

于 2014-01-13T21:19:18.317 に答える