2016-10-10 10 views
-1

以下のコードをfirefoxで使用して、プロトタイプの継承関係を2つのオブジェクト間で設定します。プロトタイプはオブジェクトから別のものに継承する

var a={}; 
var b={}; 

b.__proto__=a; 
a.dosomething=function(){ 
    alert ('ok'); 
}; 
b.dosomething();//ok 

それが唯一の原因プロト Firefoxでのみ利用可能にFirefoxのために働きます。他のWebブラウザで

、場合、bは、いくつかのコンストラクタ関数を使用して作成され、私は継承関係を設定する

b.constructor.prototype=a; 

を使用することができます。

上記の場合、a、bのコンストラクタは両方ともObjectです。 Objectのプロトタイプを変更できません。

protoを使用する以外は、継承関係を設定する方法はありますか?

コメント歓迎

+0

あなたは '__proto__'を意味しましたか? – Oriol

+0

はい、それは__proto__です – arachide

+0

上記のコードでは、aのプロトタイプとしてbを設定していませんか? 以下のコードで、なぜ 'b.prototype = a'の代わりに' b.constructor.prototype = a'をやっていますか? また、あなたは正しいオブジェクトはjsの母のプロトタイプです、私は問題をよりよく理解するように頼みます。 –

答えて

1

あなたはObject.createを使用することができます。プロトタイプが渡されたオブジェクトであるオブジェクトを作成します。

var a = {}; 
 
var b = Object.create(a); 
 

 
a.dosomething = function() { 
 
    alert ('ok'); 
 
}; 
 
b.dosomething(); // ok

また、すでに存在するオブジェクトのためのObject.setPrototypeOfを使用することができます。実際には、ではなく、を避けることができます。重大なパフォーマンス上の問題が発生します。

var a = {}; 
 
var b = {}; 
 

 
Object.setPrototypeOf(b, a); 
 

 
a.dosomething = function() { 
 
    alert ('ok'); 
 
}; 
 
b.dosomething(); // ok

+0

は、新しいb(新しいオブジェクト)を作成するためだけですが、aとbが存在する場合、継承関係を設定できますか? – arachide

+0

@arachideはい。私の編集を参照してください。 –

+0

素晴らしい!どうもありがとう – arachide

2

既存のオブジェクトのプロトタイプを変更しないでください。

警告:すべてのブラウザとJavaScriptエンジンでは、近代的なJavaScriptエンジンは、プロパティは、非常に 遅い操作にアクセス最適化する方法の性質 により、対象物の[[Prototype]]をされる変更。継承を変更するパフォーマンス上の 効果は、微妙な 遠く離れており、 obj.__proto__ = ...声明の中で過ごし、単に時間に限定されず、 はどのへのアクセス権を持っていることを任意のコードに延長することができます[[Prototype]]が変更されたオブジェクト。 パフォーマンスを気にする場合は、オブジェクトの [[Prototype]]を設定しないでください。代わりに、の希望[[Prototype]]を使用してObject.create()を使用して新しいオブジェクトを作成します。

標準の方法は、__proto__ではなくObject.setPrototypeOfです。

適切な方法は、あなたのb.constructor.prototype = a;アプローチは無用である

var a = {}; 
 
var b = Object.create(a); 
 
a.dosomething = function(){ 
 
    console.log('ok'); 
 
}; 
 
b.dosomething();

です。 bがコンストラクタCのインスタンスである場合、そのコードは変更後に構築されたインスタンスにのみ影響しますが、bには影響しません。

関連する問題