2

我见过一个 Javascript 项目,其中原型属性的定义如下:

myFunc.prototype.a = new myObject()

我想知道当我调用new myFunc()a 属性时会发生什么:

它是否返回结果new myObject()或每次我调用myFunc.a它时调用 new myObject()

在不同myFunc的实例上,a属性与普通原型属性的属性相同,还是每个实例a都是不同的myObject()实例?

请参阅此http://backbonejs.org/docs/todos.html:每个 TodoList 实例将共享相同的 localStorage,所以相同的 Backbone.LocalStorage() 实例?

4

2 回答 2

3

不,您的所有实例都myObject将具有相同的__proto__.

如果您a从一个对象访问,您将访问原型之一,但如果您a在一个对象上设置,那么这个对象将拥有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 来说是四倍。
你可以很高兴地覆盖一个人的特定对象

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!

原因是您更改了共享原型对象(静态,在其他语言中)的属性,而不是像 Jim 的情况那样替换整个原型对象(引用一个新对象,而不是静态对象)。

但是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 回答