2014-02-09 67 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如果你想获得静态,共享(在所有实例之间)值