ECMAScript 中 class N 的原型和 class N 本身的区别是什么?

What the difference between prototype of the class N and class N itself in ECMAScript?

在将我的问题标记为“JavaScript 的原型是什么?”的副本之前请注意,这个问题的重点是 ES6 classes 的原型。虽然涉及到原型链的概念,但是继承机制在ES5-的实现是题外话

不幸的是,关于inheritance and the prototype chain的一般解释并没有对我的问题给出明确的答案。相反,它会产生新的问题。

我不关心 classes 的原型,直到没有尝试创建装饰器(在非静态 class 属性 上)。在非静态 class 属性 字段的情况下,装饰器函数的第一个参数是目标 class.

的原型

从一般解释的角度来看,目标class的原型是完全没有用的(至少我不知道用它做什么甚至知道这个原型与某些class) - 似乎有价值的是 class 本身。

export function VueReactiveField(
  classPrototype: unknown, // What it this? What we can do with it? 
  fieldName: string
): void {
}

此外,原型的复杂性增加了一倍。如果我们现在有变量的方程式:

  1. 目标class(一切都清楚)
  2. 目标的实例class(一切都清楚了)
  3. 目标原型class(没看懂其本质)
  4. 目标实例的原型class(不明白其本质)

请注意,class 主要只是用于构建构造函数以及它们作为原型分配给实例的对象的语法。它不是构造函数的另一种原型继承。这是 编写 的不同方式。 (此外,class 语法中现在有一些功能,如果您以旧方式编写构造函数,则这些功能不可用,例如私有字段。)我在 中更详细地介绍了这部分内容。

通常 当有人说“class X 的原型”时,他们指的是 属性 X.prototype 上的对象。这个短语可以说不太正确(或者至少有点不精确),但它很常见。

假设您有:

class Parent {
}
class Child extends Parent {
}

即建立两个继承关系:

  1. Child.prototype 对象继承自 Parent.prototype。这样,Child.prototype 继承了 Parent.prototype 提供的原型属性(如果有的话)和方法(更常见)。

  2. Child函数继承自Parent函数(是的,真的)。这样,Child 继承了 Parent 定义的任何静态特征。

例如:

Child.prototype −−−−> Parent.prototype −−−−> Object.prototype

Child −−−−−−−−−−−−−−> Parent −−−−−−−−−−−−−−> Function.prototype

示例:

class Parent {
    parentInstanceMethod() {}
    
    static parentStaticMethod() {}
}
class Child extends Parent {
}

console.log(Object.getPrototypeOf(Child.prototype) === Parent.prototype); // true
console.log(Object.getPrototypeOf(Child) === Parent);                     // true
console.log(typeof Child.prototype.parentInstanceMethod);                 // "function"
console.log(typeof Child.parentStaticMethod);                             // "function"

What the difference between prototype of the class N and class N itself in ECMAScript?

这取决于你指的是 N.prototype 上的对象还是 N 函数的实际原型。

  • 如果你的意思是N.prototypeN是一个构造函数,但是N.prototype是将作为[=64=的原型赋值的对象N 的 ] 实例 通过 new N.

    创建
  • 如果你指的是N的实际原型:N是一个构造函数,但它的原型是它派生自的class构造函数(或Function.prototype, 如果是基数 class).