原型方法可以做什么而 es6 class 不能?
What can prototypal approach do that es6 class can't?
有什么只能通过 classic/old 原型方法才能实现的吗?
为什么我需要这个:假设我正在编写一个没有旧东西的 JS 子集(原型而不是 类、var 等)
有几件事,包括但不限于:
使用function
表示法时,可以不用new
调用构造函数。 class
表示法禁止这样做。
作为旁注:传统上子类化是用 MyParentClass.call(this)
之类的东西完成的(当 MyParentClass
被定义为 class
时,这是不允许的),你现在会将 class
语法与 extends
和 super
关键字相结合。
function
声明可以在使用后出现,因为它们被提升了,class
声明不是。
function
声明可以被新声明覆盖,class
声明不能重新定义之前的声明
- 原型方法在以旧样式定义时可以用作构造函数,而不是在使用
class
语法定义时。
function
声明可以在 "sloppy" 模式(非严格)下进行,而 class
方法总是 运行 在严格模式下。因此,您不能在 class
表示法中使用 methods/constructor 的 caller
、callee
或 arguments
属性。当然,严格模式的所有其他后果也适用。把它们都列在这里就太过分了。
- 您可以将新对象分配给旧式函数的
prototype
属性(它是可写的)。使用 class
时 prototype
属性 不可写(请注意,这并不意味着您不能 改变 它)。
有什么只能通过 classic/old 原型方法才能实现的吗?
为什么我需要这个:假设我正在编写一个没有旧东西的 JS 子集(原型而不是 类、var 等)
有几件事,包括但不限于:
使用
function
表示法时,可以不用new
调用构造函数。class
表示法禁止这样做。作为旁注:传统上子类化是用
MyParentClass.call(this)
之类的东西完成的(当MyParentClass
被定义为class
时,这是不允许的),你现在会将class
语法与extends
和super
关键字相结合。function
声明可以在使用后出现,因为它们被提升了,class
声明不是。function
声明可以被新声明覆盖,class
声明不能重新定义之前的声明- 原型方法在以旧样式定义时可以用作构造函数,而不是在使用
class
语法定义时。 function
声明可以在 "sloppy" 模式(非严格)下进行,而class
方法总是 运行 在严格模式下。因此,您不能在class
表示法中使用 methods/constructor 的caller
、callee
或arguments
属性。当然,严格模式的所有其他后果也适用。把它们都列在这里就太过分了。- 您可以将新对象分配给旧式函数的
prototype
属性(它是可写的)。使用class
时prototype
属性 不可写(请注意,这并不意味着您不能 改变 它)。