0

在 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一遍又一遍地写出来?

4

2 回答 2

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如果需要,您也可以添加一个。

于 2012-07-16T14:10:02.500 回答
1

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

于 2012-07-16T14:13:43.957 回答