2016-11-17 272 views
0

我想教自己的JavaScript類,我發現這個東西我不明白。有人可以解釋爲什麼我運行這些代碼段時會得到不同的結果嗎?繼承非構造函數

class Foo extends console { } // TypeError: console is not a constructor 

這一個非常有道理:如果您嘗試擴展的功能,是不是一個構造函數這是一個錯誤。

但是當我嘗試這與其他非構造函數,情況就不同了。

class Bar extends Symbol { } // This works 
let bar = new Bar();   // TypeError: Symbol is not a constructor 

我不明白的區別:在兩種情況下我得到了同樣的錯誤,但有時在類的聲明和其他時間只有當我嘗試創建我的子類的實例。

+0

控制檯不是構造函數是一個對象 –

+0

這就是爲什麼我們叫的console.log( )console.warn(),console.error()等 –

+0

我不能重現你的TypeError:符號不是構造函數。 –

回答

0

可以擴展(子類)任何構造任何功能可以作爲構造行爲稱爲與new操作時(和ES6 class構造不能沒有new被調用)。因此,使用constructor屬性創建對象。

在你的情況console只是一個對象,console.constructorObject

console.constructor === Object // true 

,你可以擴展它:

class SuperConsole extends console.constructor { 
    constructor() { 
    super(); 
    } 
    // ... 
} 

const myconsole = new SuperConsole(); 
typeof myconsole.log === 'function'; // FALSE! 

但是...... Object.prototype中不有loginfo ...方法,因爲它們是靜態地連接到一個簡單的對象,並延長它是沒用

順便說一句,你可以將更多的方法來console對象,或將它們複製到另一個對象或構造prototype,例如:

function Superconsole() { 
} 

Superconsole.prototype = console; 

var myconsole = new Superconsole(); 
myconsole.log('It works'); 
// It works