JS中的类方法与className.prototype方法之间的区别

时间:2019-04-19 16:07:34

标签: javascript class prototype

我想知道通过类体设置方法与JS中的原型绑定之间的区别是什么? (如果有)

我目前正在处理Eloquent JavaScript示例,当作者首先在其主体内部创建带有一堆方法的类,然后使用className.prototype.methodName = function(){}

创建另一个方法时,我感到惊讶。
class Cat {
    constructor() {
    }

    method1() {
      console.log("m1");
    }
}

Cat.protoype.method2 = function() {
  console.log("m2");
}

2 个答案:

答案 0 :(得分:3)

最明显的区别是:

您可以使用第二种方法(包括本机方法)更改每个类的原型,而第一种语法仅适用于声明您自己的类(但是另一方面,它可以使内容保持结构整洁)。

还有其他差异,在大多数情况下您可以忽略:

1)类方法是不可枚举的,而直接设置属性使其成为 enumerable

这将更等效于类语法:

  Object.defineProperty(Cat.protoype, "method2", {
     value() {
       console.log("m2");
      },
      enumerable: false, // it's the default value, this is just for clarity
      writable: true,
      configurable: true,
  });

2)super仅可在对象/类本身的声明期间(在对象和类中)添加的方法中访问。

3)函数的.name在第一种情况下为“ test”,在第二种情况下为“匿名”。可以通过将函数设为非匿名(例如, function method2() { ... }

答案 1 :(得分:0)

我希望这对您有所帮助:“除非通过原型链进一步覆盖经受这些改变的属性和方法,否则所有对象都可以通过原型链看到对对象原型对象的更改。这提供了一种非常强大但潜在的危险机制覆盖或扩展对象的行为。”

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/prototype