2014-08-29 55 views
0

訪問對象屬性我知道有幾個方法來創建對象,添加方法和屬性等 有一兩件事我不理解原型與原型

function Obj() { 
    var msg = "message"; 

    this.log = function(){ 
     console.log(msg); 
    } 
    } 
    var o = new Obj(); 
    o.log(); 

這將輸出消息。然而使用原型

function Obj2() { 
    var msg = "message2"; 

} 

Obj2.prototype.log = function() { 
    console.log(msg); 
} 

var o2 = new Obj2(); 
o2.log(); 

會輸出msg未定義。 這是爲什麼?

+0

您可以瞭解變量的作用域在這裏:https://developer.mozilla.org/en-US/docs/Web/JavaScript/指南/值,_變量,_and_literals#Variable_scope – 2014-08-29 20:28:05

回答

1

msg是一個變量,其範圍分別爲ObjObj2

第一個示例中的log函數在Obj的範圍內定義,因此它可以訪問該範圍內的變量。

第二個示例中的log函數沒有在Obj2的範圍內定義,所以它沒有定義。

+0

有沒有辦法解決它?還是不可能從原型中訪問私有屬性? – user3144851 2014-08-29 20:27:37

+0

@ user3144851:沒有「私人財產」。你使用局部變量來模擬這個變量,而變量受詞法範圍的影響。 – 2014-08-29 20:28:45

+0

從原型訪問私有變量是不可能的。相反,將該變量作爲對象的屬性。 – Quentin 2014-08-29 20:28:58

0

您有@Quentin提到的範圍問題,但是如果您需要訪問原型函數中的變量,則需要使用此類並將其視爲類。所以現在它將被視爲Obj2類的屬性,而不是作爲私有變量。

因此,代碼將是這樣的:

function Obj2() { 
    this.msg = "message2"; 

} 

Obj2.prototype.log = function() { 
    console.log(this.msg); 
} 

var o2 = new Obj2(); 
o2.log(); 

Fiddle Demonstration