簡體   English   中英

JavaScript ES6 - 如何像可以用“new”構造的那樣超級構造對象?

[英]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函數時,將采取以下步驟:

  1. 如果 NewTarget 既不是 undefined 也不是活動函數,那么
    1. 返回OrdinaryCreateFromConstructor (NewTarget, "%ObjectPrototype%" )。
  2. 如果值為null、未定義或未提供,則返回ObjectCreate (%ObjectPrototype%)。
  3. 返回到對象)。

在您的情況下,當您實例化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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM