はい、リテラルの使用prototype
は正しいです。たとえば、Mozilla はプロトタイプのドキュメントで明示的にリテラルを使用しています。
var Customer = function(name) {
this.name = name;
}
var Person = { // this is a literal
canTalk : true,
greet : function() { /* ... */ }
}
Customer.prototype = Person;
いくつかの説明:の値prototype
はobjectです。オブジェクトがどのように作成されたかは問題ではありません。単に使用しても問題ありません{}
。のようなものを使用して初期化されることがよくありますMyClass1.prototype = new MyClass2()
がnew
、新しいオブジェクトを作成するだけです。また、prototype
プロパティを設定し、コンストラクター ( MyClass2
) を実行しますが、新しいオブジェクトにはまったく影響しません(こちらMyClass1
の説明を参照してください)。
ネストされたリテラルを使用しても違いはありません。質問では、プロトタイプは に設定されてい{ literal : { ... } }
ます。呼び出したときに実際に起こることinst.literal.init()
は次のとおりです。
- ランタイムは
inst
、オブジェクトが property に割り当てられた値を持っているかどうかを調べてチェックしますliteral
。
inst
にはそのようなプロパティがないため、ランタイムはそのprototype
プロパティを使用して続行します
inst.prototype
初期化されたリテラル オブジェクトを参照します。このオブジェクトは、プロパティ に値を割り当てましたliteral
。
inst.literal
したがって、ネストされたリテラルに評価されますinst.prototype.literal
- リテラル オブジェクトにはプロパティの値があります
init
init()
関数が呼び出されます
これは JavaScript (ECMA Script) の原則の 1 つであるため、互換性の問題はありません。