2014-02-23 49 views
2

我有以下功能:作用域功能 - 使用Javascript

var Setup = function() { 
    var that = this; 
    this.x = 60; 

    Setup.prototype.Loop = function() { 
     console.log(this.x); // 1: returns 'undefined' 
     console.log(Setup.x); // 2: returns 'undefined' 
     console.log(hi.x); // 3: returns '60' 
     console.log(that.x); // 4: returns '60' 
    } 
} 

var hi = new Setup(); 

我想知道什么是从Setup.prototype.Loop功能访问this.x构造的正确方法是什么?

我已经尝试了四种方法(见上文):只有第三和第四行给我想要的结果。无可否认,行号3不是最好的方式,因为它依赖于对象hi。线路号码4似乎是我能想到的最好的事情。

我得到它的工作,但我正在努力学习最好的方式做事情。有没有其他方式或更好的方式来做到这一点?

此外,我想这是一个问题,必须以前曾问过,但不知何故,我找不到单词来找到问题。另外,如果我在这里和那里使用了一些错误的术语,请原谅我。

感谢您的回复!

+1

4.方法是要走的路,通过使用嗨,你正在访问槽实例,而不是父闭包(那)。 –

+1

应该没有输出,因为你永远不会调用'Loop'。一个问题是,Loop意味着被称为函数而不是构造函数,因此它不应该以大写L开头。另一个问题是您在构造函数体中设置了原型函数,这意味着您不知道在构造函数体中运行的共享原型对象和特定于实例的代码之间的差异。也许下面的答案可以帮助你:http://stackoverflow.com/a/16063711/1641941原型不容易理解,所以请随时问清楚什么是不明确的。 – HMR

+0

@HMR - 我的确不太了解原型,你链接的帖子是SO上最好的书面答案之一。非常感谢你。 – AKG

回答

1

原型应该在构造函数的外部设置为在创建新实例时可用。

var Setup = function() { 
    var that = this; 
    this.x = 60; 
} 

Setup.prototype.Loop = function() { 
    console.log(this.x); // 1: returns 'undefined' 
    console.log(Setup.x); // 2: returns 'undefined' 
    console.log(hi.x); // 3: returns '60' 
    console.log(that.x); // 4: returns '60' 
} 

var hi = new Setup(); 
+0

谢谢@dfsq - 但是,我发现它嵌套像我在其他人的演示代码中做的那样。无论如何,在构造函数之外设置原型和按照我的方式嵌套原型之间有什么主要区别? – AKG

2

通常原型函数应的构造函数之外定义和this.x是访问变量的正确方法。

var Setup = function() { 
    this.x = 60; 
}; 

Setup.prototype.Loop = function() { 
    console.log(this.x); 
}; 

(new Setup()).Loop(); // 60