【问题标题】:Why would I use prototype when I can just "attach" a function to the constructor? [duplicate]当我可以将函数“附加”到构造函数时,为什么还要使用原型? [复制]
【发布时间】:2012-10-03 07:00:13
【问题描述】:

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

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

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

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 中理解正确,唯一的区别是当您向原型添加某些内容时,该构造函数中的所有对象都将拥有它。还有其他原因吗?

【问题讨论】:

  • 没有其他原因,但它是一种更好的编程模式,并且在创建多个实例时效率更高。这还不够吗?
  • 你的意思是当有 1000 个 Dog 实例时,它们都使用相同的 say() 方法,而对于 1000 个 Cat 实例,我们将有 1000 个 say() 函数的副本?

标签: javascript


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    其实是的,是有区别的。当您通过原型添加方法或属性时,您可以确保此方法/属性只会创建一次,并且它们将包含在原型对象中。但是,如果您只是将您的方法添加到一个函数中,那么这些方法将与您的类的每个新实例一起被克隆。假设您的班级中有 10 个对象实例。如果您使用原型,则所有这 10 个实例只有一种方法。如果您将方法添加到函数对象本身,您将拥有 10 个方法副本。

    【讨论】:

      猜你喜欢
      • 2012-03-09
      • 2021-04-07
      • 2012-01-17
      • 2018-01-23
      • 1970-01-01
      相关资源
      最近更新 更多