2015-06-27 54 views
-2

爲什麼我不能執行以下操作?對構造函數的JavaScript添加方法

function Person(name) { 
    this.name = name; 
    this.sayHello = function() { 
    console.log("Hi, my name is " + this.name); 
    }; 
} 

var me = new Person("Robert"); 
me.sayHello(); 

輸出:Uncaught TypeError: me.sayHello is not a function(anonymous function) @ index.html:20

+0

'新人(「羅伯特」);' – thefourtheye

+0

很抱歉更新了我的意思。 –

回答

3

您需要通過調用這種方式來實例化Person的一個實例:var me = new Person("Robert");

您使用pseudoclassical實例化模式寫什麼你的構造。代碼中的工作方式是,當您使用關鍵字new時,它會在幕後調用帶有兩行代碼的Person。 原來的功能到此:

function Person(name) { 
    // The new keyword adds this line 
    // var this = Object.create(Person.prototype); 

    this.name = name; 
    this.sayHello = function() { 
    "Hi, my name is " + this.name; 
    }; 

    // and this line 
    // return this; 
} 

沒有new關鍵字,你實際上並沒有從你的函數返回任何東西。

其他原因爲什麼你可能沒有得到你所期望的。你的sayHello函數只是創建一個字符串。我假設你要登錄這個字符串到控制檯,所以修改你的功能,像這樣:

this.sayHello = function() { 
    console.log("Hi, my name is " + this.name); 
} 

你的最終代碼應該是這樣的:

function Person(name) { 
    this.name = name; 
    this.sayHello = function() { 
    console.log("Hi, my name is " + this.name); 
    }; 
} 

var me = new Person("Robert"); 
me.sayHello(); 
+0

不好意思把這個問題更新到了我的意思。 –

+0

我剛剛發佈了一個快速解答您的問題,同時我更徹底地更新了它。它現在能更好地回答你的問題嗎? – ChadF

+0

確定更新後的代碼如您指定。出現錯誤:'未捕獲的TypeError:me.sayHello不是一個函數' –

1

一個「新」的關鍵字創建臨時對象「這'在你的costructor函數'Person'中。沒有「新」,這是指全局對象(大多數情況下)。

調用:new Person(「Somebody」)返回這個臨時對象'this',所以你得到基於它的對象。

沒有關鍵字'new',你的構造函數只返回'undefined'(如果函數體中沒有任何'return'關鍵字)。