2012-01-14 6 views
1

Google Javascript Coding Guidelinesでは、「これらの階層は、最初に表示されるよりもはるかに難しい」ため、マルチレベルのプロトタイプ階層は使用しないでください。 。実際には私はそれが意味することを得ていませんでした。その使用法を説明し、その悪影響を説明するための良い例をどこで見つけることができますか?Javascript:複数レベルのプロトタイプ階層とは何か、なぜそれを避けるべきか

+3

プロトタイプ継承の基本はよく知っていますか? –

+0

それはどんな理由ですか?それらを正しく行う方法がわかったら、あなたは大丈夫です。 –

+0

あなたがそれらを使うべきではないと言っているわけではありません。それは単にライブラリを使うべきだと言います。短い要約「望ましくない」は誤解を招きやすいもので、おそらく手作業による手抜きを指しています。 – user123444555621

答えて

0

これはプロトタイプチェーン解決の問題のためです。 foo.barのようなものがある場合、barプロパティがfooオブジェクトに直接属しているわけではないので、プロトタイプチェーンfoobarを検索し始めます。チェーンが長い場合、プロパティの分解能は比較的長い動作になる可能性があります。

+0

しかし、パフォーマンス上の問題の可能性があるだけに、「正しい」ということは問題ではありません。あなたはもう少し話すことができますか? – nnnnnn

+0

私はそれがパフォーマンスの問題だとは思わない... –

+0

これは実用的なブラウザではパフォーマンス上の問題ではなく、プロトタイプチェーンは高度に最適化されています。 – Raynos

5

これは、2つのレベルの継承の例である:

ここ
// 1. level constructor 
var Dog = function (name) { 
    this.name = name; 
}; 

Dog.prototype.bark = function() { /* ... */ }; 

// 2. level constructor 
var TrainedDog = function (name, level) { 
    Dog.apply(this, arguments); // calling the super constructor 
    this.level = level; 
}; 

// set up two-level inheritance 
TrainedDog.prototype = Object.create(Dog.prototype); 
TrainedDog.prototype.constructor = TrainedDog; 

TrainedDog.prototype.rollOver = function() { /* ... */ }; 

// instances 
var dog1 = new Dog('Rex'); 
var dog2 = new TrainedDog('Rock', 3); 

dog1Dogプロトタイプからbarkメソッドを継承し、そしてdog2は(Dogプロトタイプから)その方法とからrollOver方法の両方を継承しますTrainedDogプロトタイプ。

2

私は記事が手動でこれが

に簡素化することができる

var Child = function Child() { ... }; 

Child.prototype = Object.create(Parent.prototype); 
Child.prototype.constructor = Child; 
// for some common value of extend 
extend(Child.prototype, { 
    ... 
}); 

しなければならないでしょうgoog.inheritsまたはutil.inherits

のように、手動でプロトタイプチェーンを設定するが、ライブラリを使用していないを参照していると考えています

var Child = function Child() { ... }; 

goog.inherits(Child, Parent); 
extend(Child.prototype, { 
    ... 
}); 

ここで、goog.inheritsは、レガシーブラウザでObject.createのエミュレーションも処理します。

関連する問題