2017-05-07 192 views
2

我有一個關於JavaScript的問題! 我一直在學習JavaScript幾天,但它並不是那麼難,因爲我知道有很多來自Java的知識。到目前爲止,我已經編程了很長時間。我與對象一起工作,我想爲對象添加一個函數。但是,這funcion不能正常工作... 代碼:JavaScript對象的函數不返回

<!DOCTYPE html> 

<html> 

<head> 
<script type="text/javascript"> 

    function person(name){ 
     this.name = name; 
    } 

    function printName(){ 
     return this.name; 
    } 

    var joza = new person("Josip"); 


</script> 
</head> 
<body> 
<script type="text/javascript"> 
document.write(joza.printName()); 
</script> 
</body> 

</html> 

所以這個代碼應該使用對象的功能,並打印出它的名字...... 但是......我得到的只是一個空白網頁! 請幫忙!! 謝謝!

回答

1

你得到了一些殘酷的答案,而是一個有詞法閉包似乎缺少。所以你在這裏:

function Person(name){ 
    this.printName=function(){ 
    console.log(name); 
    }; 
} 
test=new Person("John"); 
test.printName(); 

問題是JavaScript函數保留了聲明它們的環境。所以這裏的內部函數可以訪問外部函數的局部變量,即使外部函數沒有運行了。其實它類似於訪問Java中的匿名內部類final局部變量,只是這些變量不必是最終的(所以這將是完全有可能提供的setName方法,它會改變的同名變量)。

這不是很重要/有趣的這一特定使用案例,但是這是一種常見的方式,你如何能得到的參數爲例如回調方法。

而混淆的最佳部分:

您的原始代碼也可以使用。 JavaScript是不是「本」很挑剔,你可以在任何對象上調用任何方法:

function Person(name){ 
    this.name=name; 
} 
function printName(){ 
    console.log(this.name); 
} 
test=new Person("Jane"); 
printName.call(test); 

函數是對象,他們有一個call方法。第一個參數設置爲this,其餘的只是作爲參數傳遞給方法本身。爲了完整性,還有一個apply方法,其中函數的參數作爲數組傳遞。

這不是在這裏非常重要要麼,但是你應該記住的事情是,this不一定是你所期望的對象。再次回調方法:如果使用對象方法作爲回調,當瀏覽器調用它時,this通常是window對象。

+0

非常感謝你的電話功能!我想要做這樣的事情,但我不知道電話()謝謝! :D – Joza100

+0

@ Joza100 ehm,歡迎您,請記住,廣泛使用'''call'''被認爲是可怕的風格。雖然你可能會發現其中一些細節很有用,但這個問題的經典解決方案實際上是'''this.name = name; this.printName = function(){...};'''或者帶有prototype像'''this.name = name;'''在構造函數中和'''person.prototype.printName = function(){...};'''分開) – tevemadar

+0

OK!謝謝!!如果只有我知道關於原型的東西...我必須學習它們 – Joza100

0

檢查本次修訂:

var person = function(name){ 

    var tmp = {}; 
    tmp.name = name; 

    tmp.printName = function(){ 
     return tmp.name; 
    } 
return tmp; 
} 

var joza = new person("Josip"); 

小提琴:https://jsfiddle.net/jwvvkgaf/

這是一個工廠模式,來完成你想要的方式之一。

如果你想簡單的構造模式:

var person = function(name){ 
    this.name = name; 

    this.printName = function() { 
    return this.name; 
    } 

} 
+0

嗯..我只是在這個編程語言是初學者所以這段代碼是有點難以理解,我...我發現了一個更好的答案!感謝您試圖幫助! :D – Joza100

0

只是一個小變化(你試圖調用person對象的printName方法)。

function person(name){ 
    this.name = name; 
    this.printName = function() { 
    return this.name; 
    } 
} 

var joza = new person("Josip"); 

document.write(joza.printName()); 
+0

哦,剛纔注意到,你在我之前寫了和我一樣的東西。我會刪除我的答案。 –

+0

謝謝@OlivierKrull –

+0

非常感謝。我遵循TheNewBoston的教程,他用第一個函數編寫函數,我只是跟着他。但是,現在我知道我想要什麼。謝謝 – Joza100

0

(function(global){ 
 
    function person(name){ 
 
     this.name = name; 
 
    } 
 

 
    person.prototype ={ 
 
     printName: function(){ 
 
     return this.name; 
 
     }, 
 
    }; 
 
    
 
    window.person = person; 
 
}(window)); 
 
    
 
var joza = new person("Josip"); 
 

 
document.write(joza.printName());

讓我打破它給你的。 (function(){ /* code in here */ }())這是一個範圍。基本上就像一個命名空間,所以你不會污染window全局變量。然後你聲明構造函數初始化屬性name或多或少是你的「構造函數」的函數人。然後,將你的函數放入原型中並調用它們。

+0

嗯..我只是這種編程語言的初學者,所以這段代碼對我來說有點難以理解......我找到了更好的答案!感謝您試圖幫助! :D – Joza100

+0

試圖解釋它好一點,希望它有幫助! – Gacci

1

忽略現在這裏的HTML是你的代碼:

function person(name){ 
    this.name = name; 
} 

function printName(){ 
    return this.name; 
} 

var joza = new person("Josip"); 
joza.printName() // Error 

那麼是什麼上面的事情是,你正在創建的是外面這個人的構造函數,然後另一個功能。你的joza對象沒有printName函數。

printName函數只是一個常規函數,它有自己的上下文,在這種情況下,它只是窗口。

當您調用joza.printName時,您會發現printName在您剛剛創建的joza對象上不存在。

嘗試此通過,而不是添加您的printName方法實際返回的Person對象:

function person(name){ 
    this.name = name; 
    this.printName = function() { 
    return this.name 
    } 
} 

var joza = new person("Josip"); 
joza.printName() // "Josip" 
+0

感謝您的回答,但已有相同的答案!謝謝你的解釋,因爲解釋 – Joza100

0

下面是在JavaScript中添加對象,如Java

function person(name){ 
      this.name = name; 
     } 

添加這樣的方法方式。所有Person對象將能以 '新'

var joza = new person("Josip"); 

調用方法這樣

joza.printName(); 
0
<html> 
<head> 
    <script type="text/javascript"> 
     function person(name) { 
      this.name = name; 

      this.printName = function() { 
       return this.name; 
      } 
     } 
     var joza = new person("Josip"); 

    </script> 
</head> 
<body> 
    <script type="text/javascript"> 
     document.write(joza.printName()); 

    </script> 
</body> 
</html> 

function printName(){ 
     return this.name; 
    } 
調用此

person.prototype.printName = function(){ 
    return this.name; 
} 

實例化新對象

不是Person成員,所以你可以從它的名字屬性,你應該把方法pesron對象內部