javascript - 原型(prototype)函数可以访问局部变量吗?

标签 javascript prototype

我认为使用 .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/

相关文章:

javascript - 函数对象内部原型(prototype)

javascript - 为什么这段 JavaScript 代码不起作用?

javascript - 揭示原型(prototype)模式不适用于 Array

javascript - 使用 JavaScript 转换 Twitter 的created_at 日期?

javascript - 如何在 REDOM.JS 中追加元素

javascript - moment.js 在 3 月和 8 月的最后一天返回 "Invalid date"

javascript - VueJS 方法不从 Axios 返回响应

javascript - JS Canvas 在网格旁边绘制了线条

javascript - Javascript什么时候可以开始调用Actionscript?

javascript - jQuery/javascript 事件 - 原型(prototype)事件处理程序