![](/img/trans.png)
[英]Javascript + JsDoc: How to document new ES6 datatypes like map?
[英]JavaScript ES6 - How to super-construct Object like it can be constructed with "new"?
class Foo extends Object {
constructor(value) {
super(value)
}
}
a = new Object(10);
b = new Foo(10);
console.log(a.valueOf() === b.valueOf()) // false, why?
我最后一次檢查,創建擴展另一個類,做什么,但使用的構造函數調用超一流this
子類中的構造函數會影響this
相同的方式,超類的實例使用創建new
的影響。
那么為什么會出現這種不一致,是否有任何解決方法?
我正在嘗試創建一個類,該類實例化返回傳遞給其構造函數的第一個參數的任何值,但分配了其他屬性。
問題是Object
僅在 NewTarget 未定義或不是Object
構造函數本身時才強制Object
。 否則,它返回一個從 NewTarget 的.prototype
繼承的普通對象。
當使用可選參數value調用
Object
函數時,將采取以下步驟:
- 如果 NewTarget 既不是 undefined 也不是活動函數,那么
- 返回OrdinaryCreateFromConstructor (NewTarget,
"%ObjectPrototype%"
)。- 如果值為null、未定義或未提供,則返回ObjectCreate (%ObjectPrototype%)。
- 返回到對象(值)。
在您的情況下,當您實例化Foo
, NewTarget 將是Foo
,因此this
值將被初始化為Object.create(Foo.prototype)
,而不是new Object(value)
。
所以你不能直接這樣做。 但是有手動方法:
function valueOf(value) { var result; [Boolean, Number, String, Symbol, Object].some(function(F) { try { result = F.prototype.valueOf.call(value); return true; } catch(err) { return false } }); return result; } class Foo { constructor(value) { if(Object(value) === value) // Is an object return value; /* or maybe `return this`? */ switch(typeof value) { case 'boolean': return Reflect.construct(Boolean, [value], Foo); case 'number': return Reflect.construct(Number, [value], Foo); case 'string': return Reflect.construct(String, [value], Foo); case 'symbol': return Reflect.construct(Symbol, [value], Foo); } // For undefined and null, let it return `this` } } console.log(valueOf(new Object(true)) === valueOf(new Foo(true))); console.log(valueOf(new Object(10)) === valueOf(new Foo(10))); console.log(valueOf(new Object("ab")) === valueOf(new Foo("ab")));
請注意,您需要一個自定義函數來獲取適當的值。 這是因為,即使new Foo('10')
返回一個數字對象,它也繼承自Foo.prototype
,它的原型鏈中不包括Number.prototype
。 但我想這是有意的,否則你可以直接return Object(value)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.