2012-07-16 140 views
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

回答

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

+0

对象文字符号似乎是要走的路,谢谢。 – 2012-07-16 14:30:22

+0

不客气@JackM – 2012-07-16 14:31:22

1

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