-3

オブジェクトの継承を使用することに関心がない場合、JavaScript のオブジェクトに Prototype 関数を使用する意味はありますか?

別の言い方をすれば、Prototype 関数には、継承のメカニズムを実現する以外の目的がありますか?

4

2 に答える 2

2

... 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

于 2013-10-13T14:40:55.450 に答える
0

従来の継承 (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 をご覧ください。

于 2013-10-13T14:47:49.653 に答える