在函数原型的属性中使用new

时间:2012-12-15 17:05:14

标签: javascript

我见过一个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()实例?

2 个答案:

答案 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);