オブジェクトの継承を使用することに関心がない場合、JavaScript のオブジェクトに Prototype 関数を使用する意味はありますか?
別の言い方をすれば、Prototype 関数には、継承のメカニズムを実現する以外の目的がありますか?
オブジェクトの継承を使用することに関心がない場合、JavaScript のオブジェクトに Prototype 関数を使用する意味はありますか?
別の言い方をすれば、Prototype 関数には、継承のメカニズムを実現する以外の目的がありますか?
... Prototype 関数には、継承のメカニズムを実現する以外の目的がありますか?
prototype
オブジェクトのプロパティを意味していると思いFunction
ます。(JavaScriptには「プロトタイプ機能」はありません。)
「継承」が何を意味するかによって異なります。prototype
インスタンスのプロパティの目的は、Function
その関数をコンストラクタとして使用して作成されたオブジェクトのプロトタイプとして割り当てられるオブジェクトを指定することです。次に例を示します。
var f = new Foo(); // Assigns `Foo.prototype` as `f`'s prototype
そうf
すれば、そのプロトタイプによって定義されたプロパティにアクセスできます。それが継承の意味である場合、はい、それprototype
が関数のプロパティの唯一の目的です。
ECMAScript5 があることに注意してください。必要に応じて、コンストラクター関数を使用せずにプロトタイプを割り当てることができますObject.create
。
var f = Object.create(somePrototype); // Assigns `somePrototype` as `f`'s prototype
これらの両方のより具体的な例を次に示します。
コンストラクター関数の使用:
function Foo(name) {
this.name = name;
}
Foo.prototype.hey = function() {
console.log("Hi, I'm " + this.name);
};
var f = new Foo("Fred"); // Assigns `Foo.prototype` as `f`'s prototype
f.hey(); // Shows "Hi, I'm Fred" because `f` gets `hey` from its prototype
使用Object.create
:
var fproto = {
hey: function() {
console.log("Hi, I'm " + this.name);
}
};
var f = Object.create(fproto); // Assigns `fproto` as `f`'s prototype
f.name = "Fred";
f.hey(); // Shows "Hi, I'm Fred" because `f` gets `hey` from its prototype
したがって、 のみを使用することを好みObject.create
、ES5 対応のエンジンのみを使用している場合は、必要に応じてまったく使用できませんFunction#prototype
。
従来の継承 (Java など) とは異なり、親の属性にアクセスできます。
例えば:
var criminal = {
'name': 'John',
'crime': 'Murder'
}
criminal.name; // 'John'
var criminal2 = Object.create(criminal);
criminal2.prison = 'Famous Prison';
criminal2.name; // 'John'
criminal2.name = 'Tom';
criminal2.name; // 'Tom'
それが理にかなっているなら。ただし、Java の比較については間違っている可能性があります。
また、JavaScript を別の言語であるかのように考えています。そして、そうではありません。それは JavaScript であり、クラスや継承を持たない、プロトタイプのような言語です。
JavaScript: The Good Parts by Crockford をご覧ください。