你能从 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);
以下演示了我正在努力实现的目标。我有一个名为 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);