你什么时候在课堂而不是原型上有功能?

时间:2017-11-03 01:25:33

标签: javascript class oop

学习JS类模式,并试图找出一个例子,而不是类中的函数而不是原型。

Example 1

class SomeClass {
  constructor() {...}
  someMethod() {
    ...
  }
}

Example 2

class SomeClass {
  constructor() {...}
}

SomeClass.prototype.someMethod = function() { ... }

我的理解是,在示例1中,SomeClass的每个实例都有someMethod,而在示例2中,SomeClass的所有实例共享someMethod。所以...在我看来......如果你正在创建一个类,那么共享方法的重点是不是? (比如构造函数方法)

请提供一个具体的例子说明您为什么要做示例1。

2 个答案:

答案 0 :(得分:0)

您正在寻找的术语是"实例方法"或者"自己的方法",即放置在"类"的每个实例中的方法。

Javascript没有类,但它有类语法。通过类语法完成的所有操作也可以使用传统的函数和原型语法完成,所以:

class SomeClass {
  constructor() {}
  someMethod() {}
  static staticMethod() {}
}

与:

相同
function SomeClass() {
  // constructor body here
}

SomeClass.prototype.someMethod = function() {};

SomeClass.staticMethod = function() {};

如果你想要一个实例/自己的方法,它必须附加在构造函数中:

function SomeClass() {
  this.instanceMethod = function() {};
}

class SomeClass {
  constructor() {
    this.instanceMethod = function() {};
  }
  ...
}

您可能希望使用实例方法来创建可以访问闭包中保存的私有数据的特权方法,早期的文章是Douglas Crockford的Private Members in JavaScript,但还有很多其他参考文献(其中一些早于Crockford的工作)。

考虑:

function SomeClass(privateValue) {
  this.privilegedFn = function() {
    console.log(this.privateValue);
  }
}

在这种情况下, privateValue 的值只能通过 privilegedFn 访问,并且对于每个实例都可以不同。

答案 1 :(得分:0)

两者基本相同。 class只是新的做事方式。

做的时候

SomeClass.prototype.someMethod = function() { ... }

虽然从Someclass创建的所有对象都指向同一个方法,但this将绑定到调用该方法的对象。因此,该方法完全没有共享。上下文始终特定于对象。

当在class

中定义方法时,同样的事情发生在幕后