JavaScript 闭包操作

标签 javascript closures

我正在做一些 Node.js,我想使用闭包表示来创建我的对象。我想我错过了一些东西,因为像这样简单的东西不起作用:

var Room = function(foo) {
    this.name = foo;
    this.users= [];
    return {
        getName : function() {
            return this.name;
        }
    }
}
var room = new Room("foo");
console.log(room.getName());

我也试过不带参数..但还是不行。

var Room = function() {
    this.name = "foo";
    this.users= [];
    return {
        getName : function() {
            return this.name;
        }
    }
}
var room = new Room();
console.log(room.getName());

但是,这样的事情是可行的:

var Room = function(foo) {
    this.name = foo;
    this.users= [];
}
var room = new Room("foo");
console.log(room.name);

我不明白为什么这不起作用。

--已编辑

感谢 Amadan,我找到了正确的方法:

var Room = function() {
    var name = "foo";
    var users= [];
    return {
        getName : function() {
            return name;
        }
    }
}
var room = new Room();
console.log(room.getName());

这样就封装了“name”和“users”。

最佳答案

构造函数中的

return 将覆盖 this。所以正确的做法是:

var Room = function(foo) {
    this.name = foo;
    this.users= [];
    this.getName = function() {
        return this.name;
    }
}

var Room = function(foo) {
    return {
        name: "foo",
        users: [],
        getName : function() {
            return this.name;
        }
    }
}

第一个在原来的 this 上做所有事情;第二个将 this 替换为您需要的所有内容。

关于JavaScript 闭包操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18393824/

相关文章:

javascript - JQuery - 显示 div 和所有子标签元素

javascript - 为什么在 jquery 中动态创建的复选框定义属性的顺序会影响其值?

javascript - 使用 document.createElement ("p"时如何在 <p> 元素中间添加 anchor 标记)

javascript - 为什么在 Javascript 中使用闭包时,鼠标悬停事件不起作用?

python - 在 python 中使用这段代码有什么好处? (先设置 i = [0],然后设置 i[0] += size)

c# - 将匿名委托(delegate)与 .NET ThreadPool.QueueUserWorkItem 结合使用

javascript - 突出显示表格行中的最近日期

javascript - 针对 RegExp 的 Google Closure 编译器警告

javascript - 如何使用闭包在 Javascript for 循环中创建事件监听器?

javascript - 如何使用 AJAX 检测 Web 服务器是否宕机或未接收请求