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

Javascript JS中类方法与className.prototype方法的区别,javascript,class,prototype,Javascript,Class,Prototype,我想知道在JS中通过类主体和原型绑定设置方法有什么区别。(如有的话) 我目前正在研究一个雄辩的JavaScript示例,当作者首先创建了一个在其主体中包含大量方法的类,然后使用className.prototype.methodName=function(){} class Cat { constructor() { } method1() { console.log("m1"); } } Cat.protoype.method2 = functi

我想知道在JS中通过类主体和原型绑定设置方法有什么区别。(如有的话)

我目前正在研究一个雄辩的JavaScript示例,当作者首先创建了一个在其主体中包含大量方法的类,然后使用
className.prototype.methodName=function(){}

class Cat {
    constructor() {
    }

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

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

最明显的区别是:

您可以使用第二种方法(包括本机方法)修改每个类的原型,而第一种语法只适用于声明您自己的类(但另一方面,它保持了事物的整洁和结构化)

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

1) 类方法不可枚举,而直接设置属性则使其可枚举

这将更等同于类语法:

  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”,在第二种情况下是“anonymous”。这可以通过使函数非匿名来改变,例如,
function method2(){…}

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


不多。
只是较新的语法。是的,只是糖一样的东西。我不知道有什么实际的区别。没有区别。类语法只是后一个的语法糖。其他小的区别是
超级
和方法的
名称
,但我怀疑OP是否在乎关于这一点。@bergi哦,对了,我还没有考虑过。为了完整起见,我将添加它。它在原型上是不可枚举的,但绝对是可写的