2

プロトタイプ プロパティが次のように定義されている Javascript プロジェクトを見てきました。

myFunc.prototype.a = new myObject()

new myFunc()プロパティを呼び出すとどうなるのだろうと思っています。

それは結果を返しますか、new myObject()それとも呼び出すたびにmyFunc.anewを呼び出しmyObject()ますか?

また、異なるmyFuncインスタンスでは、aプロパティは通常のプロトタイプ プロパティで発生するのと同じものですか、それともすべてのインスタンスaが異なるmyObject()インスタンスですか?

このhttp://backbonejs.org/docs/todos.htmlを参照してください: すべての TodoList インスタンスは同じ localStorage を共有するので、同じ Backbone.LocalStorage() インスタンス?

4

2 に答える 2

3

いいえ、 のすべてのインスタンスはmyObject同じになり__proto__ます。

オブジェクトからアクセスする場合aは、プロトタイプの 1 つにアクセスしますが、1aつのオブジェクトを設定すると、このオブジェクトはaあなたが与えたものを保持し、他のオブジェクトは古いものを保持します。

于 2012-12-15T17:08:23.360 に答える
1

うまくいけば、これはあなたを助けるでしょう:

var Person = function (name, age) {
    this.getName = function () { return name; };
    this.getAge  = function () { return age; };
};


var Employee = function (employee_id) {
    this.printBadge = function () {
        console.log("#" + employee_id + " | " + this.record.getName());
    };
};

Employee.prototype.record = new Person("Bob", 32);

var jim  = new Employee(1),
    doug = new Employee(2);

jim.printBadge(); //  #1 | Bob
doug.printBadge(); // #2 | Bob

「継承よりも構成を優先する」というスローガンは、JavaScript では 4 倍になります。個人の特定のオブジェクト
を 非常にうまくオーバーライドできます。

jim.record = { getName : function () { return "Jim"; } };
jim.printBadge();  // #1 | Jim
doug.printBadge(); // #2 | Bob

プロトタイプ オブジェクト (インスタンスが参照するオブジェクト) のプロパティを変更するときは注意してください。

var jeff = new Employee(3);
jeff.record.getName = function () { return "OMG! Yuse guys is scr00d!" };

jim.printBadge();  // #1 | Jim
doug.printBadge(); // #2 | OMG! Yuse guys is scr00d!
jeff.printBadge(); // #3 | OMG! Yuse guys is scr00d!

理由は、ジムの場合のようにプロトタイプ オブジェクト全体を置き換える (静的オブジェクトではなく新しいオブジェクトを参照する) のではなく、共有されたプロトタイプ オブジェクト (他の言語では静的) のプロパティを変更したためです。

しかしX.prototype.y = new Z();、単純に次のように見ることができます:

var bob = new Person("Bob", 32);
Employee.prototype.record = bob;

var jim  = new Employee(1),
    doug = new Employee(2),
    jeff = new Employee(3);
于 2012-12-15T17:20:07.590 に答える