我认为使用 .prototype 创建的函数应该能够访问局部变量。这就是我要说的内容:
function obj() {
var a = "String";
this.innerPrint = function() {
document.write("<p>" + a + "</p>");
};
}
obj.prototype.outerPrint = function() {
document.write("<p>" + a + "</p>");
};
var inst = new obj();
inst.innerPrint();
inst.outerPrint();
我认为这两个函数会做同样的事情。但实际发生的情况是,outerPrint 无法访问变量 a。有人可以向我解释一下如何在原型(prototype)函数中获取局部变量吗?
这是运行此代码的 fiddle : http://jsfiddle.net/Wryte/mxXzg/
顺便说一句,我想使用原型(prototype)函数,因为对象的每个实例化都没有该函数的副本,但它们都指向同一个函数。
最佳答案
当然不是,您无法从第一个函数外部定义的另一个函数访问一个函数的局部变量。第二个是否在第一个的原型(prototype)属性中定义并不重要。每次调用 obj
函数都会定义一个new本地a
变量,因此您无法避免拥有需要访问它的函数的单独副本。
我假设您实际上要求该变量是本地变量而不是实例属性,因此一种可能的方法是在您的函数周围仅使用一个薄的本地包装器:
function obj() {
var a = "String";
this.wrapper = function() { outerPrint.call(this, a); }
this.innerPrint = function() {
document.write("<p>" + a + "</p>");
};
}
function outerPrint(a) {
document.write("<p>" + a + "</p>");
};
再次,我假设您有一个更复杂的函数来代替 outerPrint
,这样您就可以避免大函数的重复,但代价是最小包装器的重复。这样您就可以保留 a
变量的私有(private)性,而公共(public) getter 将允许外部代码检查其值。
更新:根据@Bergi的评论,我修改了代码,使outerPrint
成为与obj
相同范围内的本地函数。定义了构造函数。不再在原型(prototype)上,它不能直接被 obj
实例调用。请注意,所有代码都需要位于函数作用域内,以避免全局 outerPrint
函数。
关于javascript - 原型(prototype)函数可以访问局部变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12602667/