用对象范围的变量封装对象中的函数和变量

Encapsulating functions and variables in an object with object-wide variables

本文关键字:变量 对象 函数 封装 范围      更新时间:2023-09-26

所以,我想创建一个可以包含函数和变量的对象,以及包含函数和变数的对象,但我发现如果有"顶级"变量,由于作用域规则,更深层次的函数无法访问它们。例如:

var myobj = {
    foo: "test",
    bar: function() {
        return this.foo;
    },
    baz: {
        piz: "test2",
        poz: function() {
            return this.piz + this.foo;
        }
    }
}
console.log(myobj.bar());
console.log(myobj.baz.poz());

第二个调用返回"test2undefined",原因很明显-this.foo指的是baz.foo(未定义),而不是myobj。如何引用myobj以允许变量foo在该对象中的任何位置都可用?

您可以将poz()修改为:

poz: function() {
  return this.piz + myobj.foo;
}

this不能引用两个对象。所以我只是使用myobj.foo

我想,当你在那个特定的行使用这个时,你想引用myobj,所以为什么不使用对象的属性呢?

请注意,您可以通过在代码中的任何位置引用原始对象的名称来引用任何属性。

您可以将baz更改为函数并记住当前上下文

var myobj = {
    foo: "test",
    bar: function() {
        return this.foo;
    },
    baz:function() {
      var me = this;   
     return {    
        piz: "test2",
        poz: function() {
            return this.piz + me.foo;
        }
     }
    }
}
console.log(myobj.baz().poz());

您的错误是正常的。在您的poz函数中,baz对象的this引用。不是对myobj。

要更改poz函数,您应该在函数上传递上下文,如下所示:

var myobj = {
    foo: "test",
    bar: function() {
        return this.foo;
    },
    baz: {
        piz: "test2",
        poz: function(ctx) {
            return this.piz + ctx.foo;
        }
    }
}
console.log(myobj.baz.poz(myobj));

这不是一个好的解决方案,但在这种情况下,它更容易。

基本上,如果你想访问对象内部的一些属性,你应该使用var关键字来声明它。

我修改了一点你的例子:

function MyObj() {
    var foo =  "test";
    this.bar = function() {
        return foo;
    };
    this.baz = {
        piz: "test2",
        poz: function() {
            return this.piz + foo;
        }
    }
}
myobj = new MyObj();
console.log(myobj.bar());
console.log(myobj.baz.poz());