【问题标题】:Setting fields on and object referenced by the 'with' statement设置“with”语句引用的字段和对象
【发布时间】:2012-07-15 09:43:15
【问题描述】:

在 JavaScript 中,我模拟这样的类:

function MyClass() {} // Constructor

MyClass.prototype.myField = "foo";

我想我会使用 with 关键字使代码更具可读性并节省击键:

function MyClass() {} // Constructor

with (MyClass.prototype)
{
    myField = "foo";

    myOtherField = "bar";

    myMethod = // etc
}

但如果我随后创建一个实例并尝试访问这些字段中的任何一个,它们就是undefined。但是,如果我执行with (MyClass.prototype) 然后尝试从中读取值,那会起作用 - 只有当我尝试更改它们或创建新字段时它才会失败。我假设这是因为 with (myObject) 将您限定为 myObject 的克隆,而不是对原始实例的实际引用。

那么,有什么办法可以解决这个问题吗?有什么方法可以产生我想要的结果,有或没有with?还是我注定要一遍又一遍地写出MyClass.prototype

【问题讨论】:

    标签: javascript with-statement


    【解决方案1】:

    “如果我随后创建一个实例并尝试访问这些字段中的任何一个,它们就是 undefined

    您不能那样创建新字段。

    “如果我执行 with (MyClass.prototype) 然后尝试从中读取值,那将有效”

    这是因为您可以读取和更新现有字段。

    “我假设这是因为 with (myObject) 将您限定为 myObject 的克隆,而不是对原始实例的实际引用。”

    不,这是对对象的实际引用。


    这种混淆是人们回避with的部分原因。


    那么,有什么办法可以解决这个问题吗?有什么办法可以产生我想要的结果,无论是使用还是不使用?还是我注定要一遍又一遍地写出 MyClass.prototype?”

    只使用一个变量。

    var p = MyClass.prototype;
    
    p.myField = "foo";
    p.myOtherField = "bar";
    p.myMethod = "etc";
    

    您还可以覆盖现有的原型对象,允许对象字面量表示法...

    function MyClass() {}
    
    MyClass.prototype = {
        myField: "foo",
        myOtherField: "bar",
        myMethod: "etc"
    };
    

    如果需要,您也可以添加 constructor: MyClass

    【讨论】:

      【解决方案2】:

      查看this article,它解释了为什么不应该使用 with 语句 - myField、myOtherField 和 myMethod 变量将在您的代码中创建为全局变量,因为它们不作为原型的属性存在对象。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-06-03
        • 2017-06-24
        • 2019-03-04
        • 1970-01-01
        • 1970-01-01
        • 2012-05-01
        • 1970-01-01
        相关资源
        最近更新 更多