鑒于下面的示例,有人可以告訴我為什么我的 C 類顯示為匿名的嗎?我正在嘗試驗證 instanceOf BC 并且它總是錯誤的:(
先感謝您。
class A {
constructor() {
this.a = 1
}
};
class B extends A {
constructor() {
super();
this.a = 2;
}
}
B.C = class extends B {
constructor() {
super();
this.a = 3;
}
}
console.log(A, B, B.C) //[class A], [class B extends A], [class (anonymous) extends B]
let test = new B.C();
console.log(test instanceof B.C) //false
console.log(test.constructor.name) //''
uj5u.com熱心網友回復:
在大多數情況下,將匿名class運算式分配給某事物(變數、物件初始值設定項中的屬性、引數名稱(如果使用class運算式作為引數的默認值)...)會將事物的名稱分配給類。例子:
const A = class {};
console.log(A.name); // "A"
const obj = {
B: class {},
};
console.log(obj.B.name); // "B"
function example(C = class {}) {
console.log(C.name); // "C"
}
example();
但是當您將屬性添加到現有物件時有一個特定的例外。這被 TC39 認為是一種安全風險(假設您正在存盤一個類/函式,您將使用一個對您的代碼來說應該是私有的并且不會暴露給他們的密鑰來提供給不受信任的代碼),所以它是其中之一幾個不會發生的地方:
const obj = {};
obj.A = class {};
console.log(obj.A.name); // ""
如果你想B.C有一個名字,明確地給它一個:
B.C = class SomeNameHere extends B {
// ...
匿名函式運算式也是如此,有關更多資訊,請參見我的答案。
在對您所說的答案的評論中:
...但是實體驗證仍然顯示為假。關于造成這種情況的任何建議?...
無論是否B.C有名稱,問題中的代碼都不會發生這種情況。instanceof無論哪種方式都可以正常作業:
顯示代碼片段
class A {
constructor() {
this.a = 1;
}
}
class B extends A {
constructor() {
super();
this.a = 2;
}
}
// With a name
B.C = class BC extends B {
constructor() {
super();
this.a = 3;
}
};
// Without a name
B.D = class extends B {
constructor() {
super();
this.a = 3;
}
};
console.log(A, B, B.C); // [class A], [class B extends A], [class (anonymous) extends B]
let test = new B.C();
console.log(test instanceof B.C); // true
console.log(test.constructor.name); // "BC"
let test2 = new B.D();
console.log(test2 instanceof B.D); // true
console.log(test2.constructor.name); // ""
.as-console-wrapper {
max-height: 100% !important;
}
uj5u.com熱心網友回復:
您的最后一個類是 anonymus,因為您從未給它命名 C。您只是創建了一個名為 C 的屬性,其中包含 anonymus 類。
我認為您所期望的語法如下所示:
...
class C extends B {
constructor() {
super();
this.a = 3;
}
}
var B = new B();
B.C = new C();
這樣,您將定義一個名為 C 的新類,并向 B 添加一個也稱為 C 的新屬性,并用 C 的實體填充它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/489681.html
標籤:javascript 遗产 多重继承
下一篇:繼承:為什么self參考子類?
