gpt4 book ai didi

javascript - 设置 'with' 语句引用的字段和对象

转载 作者:行者123 更新时间:2023-12-02 19:30:57 24 4
gpt4 key购买 nike

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

function MyClass() {} // Constructor

MyClass.prototype.myField = "foo";

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

function MyClass() {} // Constructor

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

myOtherField = "bar";

myMethod = // etc
}

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

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

最佳答案

"if I then create an instance and try to access any of those fields, they're undefined"

您无法通过这种方式创建新字段。

"if I do with (MyClass.prototype) and then try to read values from it, that works"

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

"I'm assuming this is because with (myObject) scopes you to a clone of myObject, not an actual reference to the original instance. "

不,它是对该对象的实际引用。

<小时/>

这种困惑是人们避免使用 with 的部分原因。

<小时/>

"So, is there any way to get around this? Any way to produce the results I want, with or with out with? Or am I doomed to writing out MyClass.prototype over and over again?"

只需使用一个变量。

var p = MyClass.prototype;

p.myField = "foo";
p.myOtherField = "bar";
p.myMethod = "etc";

您还可以覆盖现有的原型(prototype)对象,允许对象文字表示法...

function MyClass() {}

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

如果需要,您还可以添加一个构造函数:MyClass

关于javascript - 设置 'with' 语句引用的字段和对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11506076/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com