2017-02-26 56 views
0

我一直在試圖創建自己的JavaScript函數,然後使用Prototype的Javascript原型錯誤

所以我創建一個函數添加方法:

function createObject(){ 
    this.value = 0; 
} 

然後我創建Prototype方法:

createObject.prototype.once = function(){ 
     return this.value+1 
}; 

然後我創建對象的實例:

var x = createObject(); 

然後,當我嘗試運行x.once()我得到:

Uncaught TypeError: Cannot read property 'once' of undefined 
at <anonymous>:1:2 

而且我不知道爲什麼。

+1

'變種x =新的CreateObject();'實例化一個對象,而不是隻調用該函數 –

+0

如果你打算使用函數作爲一個構造函數,它是標準的做法,利用函數的名字,這樣你就記得使用'new'關鍵字。還有一些與該模式相關的更好的實踐[在這個問題上](http://stackoverflow.com/a/383503/5743988)。 – 4castle

+0

你應該爲對象考慮一個更好的名字,因爲名稱'createObject'實際上使得函數聽起來像一個創建對象的函數 - 你不需要'new'關鍵字就可以調用 - 這不會解決你的問題問題,但它可能是要記住 –

回答

1

你需要使用var x = new createObject()

簡而言之,new關鍵字就是在函數返回到x的對象內設置原型鏈和this綁定的關鍵字。

我建議你看一看the MDN page瞭解更多詳情。

1

當你類的實例,你必須使用new關鍵字,類名之前。

var x = new createObject(); 

的新的運營商創建一個用戶定義的對象類型的實例或之一的 內置在具有構造函數的對象類型。

欲瞭解更多信息MDN

2

你可以通過放置在this.value = 0;行設置一個斷點,並檢查this發現這個錯誤;你會發現它不是你所期望的。

最可靠的解決方案是重寫你的構造函數,以確保它被稱爲與new,使用new.target

function CreateObject() { 
 
    if (!new.target) throw new TypeError('CreateObject() must be called with new'); 
 

 
    this.value = 0; 
 
} 
 

 
const object = CreateObject();

棉短絨可以幫你找到這種類型的錯誤,以及。例如,eslint有new-cap選項。如果你調用一個非資本化的功能與new,或撥打一個大寫功能而不new它會抱怨。要利用這一點,你必須遵循大寫構造函數的約定,如CreateObject。如果您使用的class,並試圖對其進行實例化,而不new

打字稿(或ES6以及)會報告錯誤:類型的

class CreateObject { 
    value = 0; 

    once() { return this.value = 0; } 
} 

var x = CreateObject(); 

價值「的typeof的CreateObject」是不可調用的。你是否想要包含'新'?

+1

如果您嘗試在不使用'new'的情況下構建它們,ES6類將會拋出(re:TypeScript)。 – Ryan