2014-10-29 24 views
0

我希望能够创建具有自身内在价值的对象。这样我可以在表达式中使用它,就好像它是一个常规变量。事实证明,这很容易 - 我很想知道我是否缺少一些东西。所有它似乎需要确保对象包含一个方法“valueOf”。像这样:具有自身内在价值的物体。另一种做吸尘器的方法

var p = { 
    a: 12; 
    valueOf: function(){return this.a+12} 
    } 

alert(p/3); // =8 

这也许是一个好主意,也包括一个“toString”方法。似乎发生的事情是,如果没有valueOf方法,对该对象的引用会沿着原型链向上,直到它找到Object上的方法,它只返回“object Object”。通过提供一个本地的方法,该方法可以返回任何东西。

它似乎适用于我尝试过的所有浏览器。

这是另一种提供类似getter功能的方法。但更好一点,因为getter只能应用于对象的属性。这样你可以使用对象本身。

您认为如何?这安全吗?任何陷阱?

+1

*“这是另一种提供类似getter功能的方法” - 如何? Getters为成员提供访问权限,在这里你重写对象本身的价值。 – Madbreaks 2014-10-29 17:13:41

+0

是的。但它就像一个吸气器,你可以用一个类似变量的引用来引用这个值。此外,该对象仍然具有全部属性。这只是一个额外的事情,你可以做的对象。 – 2014-10-29 23:59:50

回答

0

那么我开始使用这种模式,并发现一个问题。如果你创建一个像上面那样的对象,你必须猜测解释器将如何查看对象的引用。

例如,如果在算术表达式中使用P,则会调用该对象的valueOf()方法以获取其值。但是当你尝试访问p的一个属性,比如p.a时,它会将p视为一个对象并按照你的预期检索属性。

在一个getter中,相比之下,当p上有一个getter时访问p.a将首先运行getter,然后尝试获得结果的属性'a'。有点不同,但很重要。

这一切都很正确,似乎正确地猜测要做什么。但使用模式确实依赖于了解这种行为,哪个AFAIK没有记录在任何地方。

相关问题