当我可以将一个函数“附加”到构造函数时,为什么我会使用原型?

时间:2012-10-12 12:49:15

标签: javascript

  

可能重复:
  Use of ‘prototype’ vs. ‘this’ in Javascript?
  Advantages of using prototype, vs defining methods straight in the constructor?

我正在学习Javascript中的原型。我不太明白的一件事是为什么我应该使用CONSTRUCTOR_FN.prototype.METHOD_NAME约定添加函数而不是仅在this.METHOD_NAME的正文中使用CONSTRUCTOR

我写了这个小代码来澄清:

function Cat ( name ) {
    this._name = name;
    this.say = function ( thing ) {
        alert( this._name + " says: '" + thing + "'" );
    }
}

function Dog ( name ) {
    this._name = name;
}
Dog.prototype.say = function ( thing ) {
    alert( this._name + " says: '" + thing + "'" );
}

var c = new Cat( "Mitt");
var d = new Dog( "Barak" );
c.say( "War" );
d.say( "No war" );

据我所知,CatDog构造函数的工作方式相同。如果我从this question正确理解,唯一的区别是当你向原型中添加一些内容时,该构造函数中的所有对象都将拥有它。还有其他原因吗?

2 个答案:

答案 0 :(得分:4)

实际上是的,有区别。通过原型添加方法或属性时,可以确保此方法/属性仅创建一次,并且它们将包含在原型对象中。但是,如果您只是将方法添加到函数中,那么将使用类的每个新实例克隆方法。假设您的班级有10个对象实例。如果你使用原型,那么所有这10个实例只有1个方法。如果您将方法添加到函数对象本身,您将有10个方法复制。

答案 1 :(得分:1)

如果构造函数是由其他人编写的(例如,您下载的库),则可能无法在不修改原始代码的情况下访问构造函数进行更改。使用原型也被认为是更好的风格。