2016-08-17 10 views
3

私はSub.prototype =新しいベース()javascriptオブジェクトのプロトタイプを変更する2つの方法は、それらの違いは何ですか?

場合、私は、知りたいのjavascript

var Base=function(){this.a='abc'}; 
var Sub = function() {}; 
Sub.prototype = new Base(); // note: this pattern is deprecated! 
//Because we used 'new', the [[prototype]] property of Sub.prototype 
//is now set to the object value of Base.prototype. 
//The modern way to do this is with Object.create(), which was added in ECMAScript 5: 
Sub.prototype = Object.create(Base.prototype); 

に "継承" を実装する方法を示しており、stackoverflowのからのコードのこの部分を読んで、

は廃止され、新たな方法

Object.create(Base.prototype)はありません。

作成されるオブジェクトの内部の相違を導入しますか?任意の内部プロパティの違い、動作の違い、私は新しい方法を使用して、古いコードを新しいコードに変換しようとしますか?

ありがとうございました。

+0

Base.prototype aswellに追加します。createはBase関数を呼び出さない。この関数をプロトタイプとして設定し、プロトタイプチェーンを設定するだけです。 –

答えて

1

Imho関連することを行う現代的な方法は、classと関連キーワードです。

あなたが提案する2つのオプションは、異なる結果をもたらします。 classical inheritance with Object.createを参照してください。スーパーコンストラクタの呼び出しとprototype.constructorの再割り当てが両方とも不足しています(これは、他のケースでも欠けています)。

リンクに記載されているようにObject.createと継承を行う場合、new Base()を割り当てると比較して1つの差は特性を見つけることができる場所である。

function Base() { this.baseProp = "baseProp"; } 
 
function Sub() { this.subProp = "subProp"; } 
 

 
Sub.prototype = new Base(); 
 
Sub.prototype.constructor = Sub; 
 

 
let obj = new Sub(); 
 
console.log("obj.baseProp: " + obj.baseProp); 
 
console.log("Has baseProp on itself: " + obj.hasOwnProperty("baseProp"));

function Base() { this.baseProp = "baseProp"; } 
 
function Sub() { 
 
    Base.call(this); 
 
    this.subProp = "subProp"; 
 
} 
 

 
//Note that here Base.prototype doesnt even have anything interesting 
 
Sub.prototype = Object.create(Base.prototype); 
 
Sub.prototype.constructor = Sub; 
 

 
let obj = new Sub(); 
 
console.log("obj.baseProp: " + obj.baseProp); 
 
console.log("Has baseProp on itself: " + obj.hasOwnProperty("baseProp"));

また、Object.createはまだプロトタイプチェーンに余分な間接参照をプッシュします(他のメソッドでは、プロパティーを含むオブジェクトはBaseとなります)。しかし、余分なステップは「間違っていませんが、Subのプロトタイププロパティとプロトタイププロパティを継承していると見なすことができます(たとえば、Sub.prototypeに何かを追加したい場合は、この間接指定をせずにあなたは誤って大きな違いは、そのオブジェクトである

function Base() { this.baseProp = "baseProp"; } 
 
Base.prototype.someFunction =() => void 0; 
 
function Sub() { 
 
    Base.call(this); 
 
    this.subProp = "subProp"; 
 
} 
 

 
//Now this is important, the prototype contains something 
 
Sub.prototype = Object.create(Base.prototype); 
 
Sub.prototype.constructor = Sub; 
 

 
let obj = new Sub(); 
 
console.log("First level link has function: " + obj.__proto__.hasOwnProperty("someFunction")); 
 
console.log("Second level link has function: " + obj.__proto__.__proto__.hasOwnProperty("someFunction"));

0

私が指すことができます唯一の違いは、あなたがnewを使用するときにSubのプロトタイプがBaseインスタンスであるということです。これは、のすべてのプロパティが、サブクラス(プロトタイプメソッドだけでなく)で利用できることを意味します。

あなたの例では、Sub.prototype = Object.create(Base.prototype);は何も継承しません。 Sub.prototype = new Base()aプロパティを継承しますが、

関連する問題