Javascript原型添加属性的方法

时间:2017-04-25 15:03:55

标签: javascript

如果我有一个构造函数并想要添加其他属性,我应该使用哪个? constructorName.nameofProperty或constructorName.prototype.nameofProperty?有什么区别?

2 个答案:

答案 0 :(得分:0)

如果从下面的代码片段中查看控制台输出,您将看到向对象原型添加内容会将其添加到构造函数的所有实例中。 Jill和Tim现在都有一个setAge方法,但只有Jill确实设定了她的年龄。此外,直接添加到构造函数的内容不会继承到实例。



function Person(firstName, lastName) {
  this.firstName = firstName;
  this.lastName = lastName;
}

var Tim = new Person("Tim", "Dawson");
var Jill = new Person("Jill", "Swanson");

Person.prototype.setAge = function(age) {
  this.age = age;
}

Jill.setAge(28);

Person.doesThisInherit = function() {
  console.log("No it doesn't");
}

var Sam = new Person("Sam", "Testy");

console.log(Tim);
console.log(Jill);
console.log(Sam);




答案 1 :(得分:0)

这取决于。

您是否希望从构造函数返回的对象具有这些属性?如果是这样,您需要将该属性扩充为从构造函数返回的对象:

var constructorFunction = function () {
  this.someProperty = someValue;
}

是否要向构造函数添加属性(请记住函数是对象,以便为它们添加属性)?如果是这样,那么

constructorName.someProperty = someValue

我认为这不是你想要的。这不会影响从构造函数返回的对象。它只是为函数添加了一个属性。

如果需要,您可以将属性附加到原型。这意味着使用该函数构造的所有对象(如果使用'new'前缀调用它)将通过其原型链引用该属性。这意味着每个对象都没有自己的属性副本,但都会引用同一个属性。也就是说,附加到构造函数的原型对象。如果这是一个问题,这可以节省你的记忆。如果没有,那么每个对象最好拥有它自己的属性副本,这是第一个例子的作用。这样,更改其中一个对象的属性不会影响从同一个构造函数创建的其他对象。