2014-02-09 49 views
0

Introduction to Object-Oriented JavaScript中,給出了關於如何以面向對象的方式使用javascript的形式化描述。您的函數中的對象代碼將線沿線的喜歡:如何正確使用Javascript進行OOP並明確指定變量作用域?

$(function() { 
    var oPerson = new cPerson("Florian"); 
    alert("Hi! My name is " + oPerson.sMyNameIs()); 
}); 

function cPerson(sSetName) 
{ 
    var sName= sSetName; 
    var oPersonInst = this; 

    this.sMyNameIs = function() { 
    return sName; 
    }; 
} 

有了更多的經驗,你可能需要一個更皆伐參考實例化的類,所以你修改類代碼本身(我加過另一功能):

function cPerson(sSetName) 
{ 
    var sName= sSetName; 
    var oPersonInst = this; 

    this.sMyNameIs = function() { 
    return oPersonInst.sName; 
    }; 

    this.sMyFullNameIs = function() { 
    return oPersonInst.sMyNameIs(); 
    }; 
} 

現在我們已經來到翻過三種不同的方式類函數中提到的功能或變量:

return sName; 
return this.sName; 
return oPersonInst.sName; 

蘇ppose我想在實例化的類中非常明確地調用sName變量,隨着開發的進行,這些示例函數將越來越複雜和深入。

我認爲第一個選項('return sName;')是不確定的,因爲您不太確定您是否引用了正確的目標實例化類作用域中的變量。這可能是您打電話時的一個意外的本地變量。

第二,使用this,恕我直言,也不是完美的,因爲this根據情況顯然改變,你不能(?)依賴於你特別要求在實例化類權的變量。

所以第三個參考,恕我直言,最好看的參考。非常明確地定義在類的實例化。怎麼可能有任何疑問,類的var sName的意思。

Q1:爲什麼用this.定義的類中的函數?難道不能用oPersonInst.something = function() { //... };來定義嗎?

Q2:爲什麼在代碼完成,我已經給,alert(oPersonInst.sMyNameIs());工作,但alert(oPersonInst.sName);沒有(至少不內$.each(something, function() { //right here })),但alert(sName); DOES(因爲上述原因不被看好恕我直言)工作?

Q3:可有人煲一些示例代碼,甚至可能更改此示例代碼,其中固體外的局部範圍內引用時,會在外面工作,以及內部$.each(...)回調函數(或其他回調相關功能)?

請原諒我的困惑,我們都是學習者,我感到腦海中有一個洞。這篇文章沒有很好地解釋我對此的擔憂。

回答

0

這不會隨機變化..它總是意味着當前閉合(功能):

  • 如果你在function_1() - 這意味着function_1
  • 如果你是在function_1> function_2 - function_2是當前閉合,這意思是function_2

如果你在function_2中需要function_1這個,你必須在function_1中捕獲它:
意思是var function1This = this;


以及在表示靜態訪問之前使用函數名稱引用var的方式。它有不同的語義


所以使用this.var,以確保您獲得實例的變量
使用「捕捉到這個指針」來訪問你的父母實例的變量

,並且只使用name.var如果你想獲得靜態,共享(在所有實例之間)值