我见过一个Javascript项目,其中的prototype属性定义如下:
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()实例?
答案 0 :(得分:3)
不,myObject
的所有实例都具有相同的__proto__
。
如果从对象访问a
,您将访问原型中的一个,但如果在一个对象上设置a
,则此对象将包含您提供的a
内容他和其他人会留下旧的。
答案 1 :(得分: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!
原因是您更改了共享原型对象的属性(静态,在其他语言中),而不是替换WHOLE原型对象(引用新对象,而不是静态对象),就像在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);