我见过一个Javascript项目,其中原型属性定义如下:
myFunc.prototype.a = new myObject()
我想知道当我调用 new myFunc()
到 a 属性时会发生什么:
它是否返回new myObject()
的结果,或者每次我调用myFunc.a
它调用新myObject()
?
在不同的myFunc
实例上,a
属性与普通原型属性相同,或者每个实例的a
myObject()
实例都不同?
请参阅此 http://backbonejs.org/docs/todos.html:每个TodoList实例将共享相同的localStorage,因此相同的Backbone.LocalStorage()实例?
不,您的所有myObject
实例都将具有相同的__proto__
。
如果你从一个对象访问a
,你将访问原型之一,但如果你在一个对象上设置a
,那么这个对象将拥有你给他的任何a
,而其他对象将保留旧的。
希望这会对您有所帮助:
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);