你能从 JavaScript 中的基数 class 得到 dervied class 吗?

Can you get the dervied class from the base class in JavaScript?

以下演示了我正在努力实现的目标。我有一个名为 X 的基 class,它没有任何作用...

function X() {
}

我声明了一个继承自 X 的名为 Y 的派生 class。它还在派生的 class 名称上设置了一个 属性。这并不意味着适用于每个实例,因此放在 class 本身上。

function Y() {
  X.call(this);
}

Y.prototype = new X();
Y.name = 'Y';

我们添加另一个派生的 class,称为来自 X 的 Z。这次它为名称 属性 设置了不同的值。

function Z() {
  X.call(this);
}

Z.prototype = new X();
Z.name = 'Z';

现在,从实际基础 class 我希望能够测试和使用任何派生 class 的名称 属性。我找不到实现这一目标的方法。所以理想情况下它会像这样工作...

function X() {
    console.log(???.name);
}

当然,我不知道该在 ???在调用基础 class 构造函数时获取实际派生的 class 实例。也许这是不可能的?

如果有一个从 Y 或 Z 派生的 class 可以遍历 class 链,那么我也可以获得 name 的所有中间值。如果这是不可能的,那么你能建议一种替代方法吗?

首先,正确地子类化,恢复 constructor:

function X() {}

function Y() {
  X.call(this);
}
Y.prototype = Object.create(X.prototype);
Y.prototype.constructor = Y;
Y.name = 'Y';

function Z() {
  X.call(this);
}
Z.prototype = Object.create(X.prototype);
Z.prototype.constructor = Z;
Z.name = 'Z';

那你可以用this.constructor.name.

function X() {
  this.theName = this.constructor.name;
}

function Y() {
  X.call(this);
}
Y.prototype = Object.create(X.prototype);
Y.prototype.constructor = Y;
Y.name = 'Y';

function Z() {
  X.call(this);
}
Z.prototype = Object.create(X.prototype);
Z.prototype.constructor = Z;
Z.name = 'Z';

document.write(new Y().theName + '<br />' + new Z().theName);

请注意,您在使用 name 属性 时可能会遇到问题。前段时间一些浏览器在函数中实现了一个非标准的不可写name 属性。 ES6 对其进行了标准化,现在它是可写的,但在旧浏览器上可能会出现问题。

所以最好使用另一个名称,或者将其存储在 prototype

function X() {
  this.theName = this.name;
}

function Y() {
  X.call(this);
}
Y.prototype = Object.create(X.prototype);
Y.prototype.constructor = Y;
Y.prototype.name = 'Y';

function Z() {
  X.call(this);
}
Z.prototype = Object.create(X.prototype);
Z.prototype.constructor = Z;
Z.prototype.name = 'Z';

document.write(new Y().theName + '<br />' + new Z().theName);

您真的不应该将 class 设计模式与 java 脚本一起使用:它的工作方式与 java 不同。

试试这个。

    var original = {
    setName: function(name) {this.name = name};
    }

    var newObject = Object.create(original);

不创建副本,但继承变量 original 作为原型,并可以访问它的属性以用于新对象。

    newObject.setName(tony);

console.log(newObject.name);