在函数原型的属性中使用新功能



我见过一个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);

最新更新