【问题标题】:Do we create prototypes so we dont have to store methods in our constructor functions?我们是否创建原型以便我们不必在构造函数中存储方法?
【发布时间】:2020-11-28 05:59:54
【问题描述】:

我有点困惑,关于构造函数的 JavaScript 原型,我想我在这里得到了一些错误的建议(或者让我感到困惑的建议)。 1)我们是否创建原型以使我们的构造函数更小,以便我们不必在其中存储多个可能不会被每个新对象实例使用的方法?或者 2)我们是否创建原型来设置类,然后将它们分配给每个对象实例,以便它们可以访问某些方法而不是其他方法。有人告诉我选项 2,但在任何地方都找不到这方面的证据?

谢谢大家

【问题讨论】:

  • 不清楚您(或您的顾问)所说的“将它们分配给每个对象实例”和“以便他们可以访问某些方法而不是其他方法”。你能澄清一下吗?
  • 他的类比是把它想象成一个电脑游戏,你不会想给所有角色相同的方法,否则游戏会很无聊,你希望他们都做不同的事情,所以如果您将类分配给不同的对象实例(变量),那么每个人都可以访问一组特定于其功能的属性,尽管我在我的研究中没有看到任何证据,只有所有方法都适用于所有实例(变量)附加到原型!谢谢回复
  • 这与在构造函数中创建方法或将它们放在原型上的问题无关。要创建不同类型的角色,您需要使用不同的类(构造函数、原型)和不同的方法。

标签: javascript class object constructor prototype


【解决方案1】:

原型方法将适用于所有实例。在构造函数中创建的方法也可以在所有实例上,前提是您没有有条件地不创建它们的逻辑。尽管在构造函数中创建它们可能会为每个实例化创建一个新的唯一版本的方法。

几个 sn-ps 演示了这些差异。

原型

class Fun {
  constructor ( name ) {
    this.name = name;
  }
  
  sayHi () {
    console.log( `Hi ${this.name}!` );
  }
}

var fun1 = new Fun( 'james' );
var fun2 = new Fun( 'jill' );

fun1.sayHi();
fun2.sayHi();

console.log( 'Are they the same method in memory?', fun1.sayHi === fun2.sayHi );

console.log( 'Is the method shared?' );

delete Fun.prototype.sayHi;

try {
  fun1.sayHi();
} catch ( e ) {
  console.error( e );
}

try {
  fun2.sayHi();
} catch ( e ) {
  console.error( e );
}

构造函数定义

class Fun {
  constructor ( name ) {
    this.name = name;
    
    this.sayHi = function () {
      console.log( `Hi ${this.name}` );
    };
  }
}

var fun1 = new Fun( 'james' );
var fun2 = new Fun( 'jill' );

fun1.sayHi();
fun2.sayHi();

console.log( 'Are they the same method in memory?', fun1.sayHi === fun2.sayHi );

console.log( 'Is the method shared?' );

delete fun1.sayHi;

try {
  fun1.sayHi();
} catch ( e ) {
  console.error( e );
}

try {
  fun2.sayHi();
} catch ( e ) {
  console.error( e );
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 2014-06-13
    • 2012-08-16
    • 2023-03-28
    • 2021-09-23
    • 1970-01-01
    • 2021-08-31
    相关资源
    最近更新 更多