2016-09-20 104 views
1

我知道,JavaScript中的函數只不過是一個具有帶構造函數原型屬性的對象,可以用來實例化新對象。功能與JavaScript中的對象和沒有函數的實例

但是,這是不可能做到以下幾點:

let Pear = { 
    prototype : Object.prototype 
}; 
let p = new Pear(); //Throws "caught TypeError: Pear is not a constructor" 

在我看來,這應該是完全一樣的,如:

function Pear() { 

} 
let p = new Pear(); 

的作品。 我只是想知道差異在哪裏。我的第一種方式有沒有修復? 或者「功能」沒有「真正」的對象,並得到不同的待遇?這真的只是一件好奇的事情。實際上沒有什麼重要...

回答

2

new運行的對象必須實現[[Construct]]內部方法,否則將引發TypeError異常(您觀察到的)。

知道了,我不相信你可以將new與使用對象字面值語法生成的對象結合使用。

但是,如果你正在定義類似的東西,你可能不想想要來。您可以創建一個新對象,其中包括Object.assign()的前者的屬性。

let p = Object.assign({}, Pear); 

或者,您可以使用另一種方法將對象的原型更改爲其他內容。

+0

那就是我還想到的:JavaScript中有兩種不同的對象。函數對象和對象對象。函數對象有一個特殊的屬性(字符串),其中包含可以用()調用的可評估內容。普通對象不包含此屬性。它似乎不可能將一個對象對象轉換爲一個函數對象。 – David