我想知道通过类体设置方法与JS中的原型绑定之间的区别是什么? (如果有)
我目前正在处理Eloquent JavaScript示例,当作者首先在其主体内部创建带有一堆方法的类,然后使用className.prototype.methodName = function(){}
class Cat {
constructor() {
}
method1() {
console.log("m1");
}
}
Cat.protoype.method2 = function() {
console.log("m2");
}
答案 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