2017-08-07 44 views
0

我已經嘗試了不同的模式來實現Javascript中的繼承,但他們都沒有使用內置對象,如Set。例如,使用method described in MDN是否可以從內置對象繼承?

function Test() { 
    Set.apply(this, arguments); 
} 
Test.prototype = Object.create(Set.prototype, {}); 
Test.prototype.constructor = Test; 

var test = new Test(["a", "b"]); 

產生以下錯誤:

Uncaught TypeError: Constructor Set requires 'new' 
    at Test.Set (native) 
    at new Test (<anonymous>:2:9) 
    at <anonymous>:1:9 

這是有道理的,因爲我得到的對象不包含本地Set實施。除了製作完整的包裝外,是否有支持這些操作的模式?

+1

總是有[*語言規範*](http://ecma-international.org/ecma-262/8.0/#sec-set-constructor):「*設置不打算作爲一個函數被調用,並會拋出一個異常當以這種方式調用時。*「以下是如何進行子類化的說明。 – RobG

+0

哦,你得到的錯誤是說你打電話*設置錯誤。如果它不被支持,你會得到一個參考錯誤。 – RobG

回答

0

我想要的是Set構造函數。 試試這個,

function Set(){ 
    // init stuff 
} 

function Test() { 
    return new Set.apply(this, arguments); 
} 
Test.prototype = Object.create(Set.prototype, {}); 
Test.prototype.constructor = Test; 

var test = new Test(["a", "b"]); 
+0

你嘗試過嗎? – RobG

+0

實際上,我寫在第一行'我猜' –

+0

我面臨着同樣的問題一次,通過使用構造函數解決,如果你有任何最好的選擇,請分享,將不勝感激 –

0

您需要使用延伸和需要打個電話,是這樣的:

class mySet extends Set { 
 
    constructor (iterable, name) { 
 
    super(iterable); 
 
    this.name = name; 
 
    } 
 

 
    // Read a Set property 
 
    howMany() { 
 
    return this.size; 
 
    } 
 

 
    // Call a Set method 
 
    showEm() { 
 
    this.forEach(v=>console.log(v)); 
 
    } 
 

 
    // Add your own methods 
 
    // ... 
 
} 
 

 
var aSet = new mySet([0,1,2,3], 'aSet'); 
 

 
console.log(aSet.name);  // aSet 
 
console.log(aSet.howMany()); // 4 
 
aSet.showEm();    // 0 1 2 3 
 

 
// Call set method directly 
 
console.log(aSet.has(3));  // true