2011-07-09 6 views
3

JSで継承を行うと、派生クラスで基本クラスのプロパティと重複する追加のプロパティが見つかる。派生クラスに強制的に基本クラスのプロパティを使用させる方法を推測することはできません。私は、私が相続モデルを修正できるように、または私がプロトタイプの継承を使用している方法を変えることができるように、正しい方向に少し押してください。Javascriptプロトタイプの継承により、派生クラスに追加のプロパティが作成される

のは、私は、この典型的な継承機能を開始するとしましょう:

Function.prototype.inheritsFrom = function(parentClassOrObject){ 
if (parentClassOrObject.constructor == Function) { 
    this.prototype = new parentClassOrObject; //Normal Inheritance 
    this.prototype.constructor = this; 
    this.prototype.parent = parentClassOrObject.prototype; 
} else { 
    this.prototype = parentClassOrObject;  //Pure Virtual Inheritance 
    this.prototype.constructor = this; 
    this.prototype.parent = parentClassOrObject; 
} 
return this; 
}; 

あなたはおそらく前にこれを見てきました。

var e = new entity(); 
e.init("Mickey"); 
console.log(e.id); 

私は私の新しいエンティティクラスのプロパティを調べる...私は今2を持って次のように

function base() { 
    this.id = 0; 
}; 

base.prototype.init = function (_id){ 
    this.id = _id; 
}; 

function entity(){ 
}; 

entity.inheritsFrom(base); 

entity.prototype.init = function(_id){ 
    this.parent.init.call(this, _id); 
}; 

は、今、私たちはエンティティクラスを使用します。今、私は次の継承を作成しますID(下記の出力を参照)。明らかにこれは簡単なケースですが、私はこれを動作させるために多くの時間を費やしてきました。

e: entity 
    id: "Mickey" 
    __proto__: base 
    constructor: function entity(){ 
    id: 0 
    init: function (_id){ 
    parent: base 
    __proto__: base 

なぜ2つのIDがありますか?派生クラスは、基本クラスの 'this.id'を参照しません。

答えて

3

inheritsFromの場合new parentClassOrObjectベースコンストラクタが呼び出され、idプロパティがプロトタイプに設定されています。方法を変更する必要があります:

Function.prototype.inheritsFrom = function(parentClassOrObject){ 
    if (parentClassOrObject.constructor == Function) { 
    function tmp() {} 
    tmp.prototype = parentClassOrObject; 
    this.prototype = new tmp; //Normal Inheritance 
    this.prototype.constructor = this; 
    this.prototype.parent = parentClassOrObject.prototype; 
    } else { 
    this.prototype = parentClassOrObject;  //Pure Virtual Inheritance 
    this.prototype.constructor = this; 
    this.prototype.parent = parentClassOrObject; 
    } 
    return this; 
}; 
関連する問題