在JavaScript中,我想将对象A标记为特殊,因此当B访问A时,B可以检查是否标记了A,以便B将A视为与其他对象不同。 (认为B是处理许多不同对象的序列化程序,A必须以某种方式序列化。)
现在,我也可以
1:在A中设置属性,例如A.special = true
2:定义一个方法,例如A.isSpecial(),如果该方法存在,则表明A是特殊的。
我知道这两件事都是一样的。从设计的角度来看,是否有任何差异,这使得一个更好?
答案 0 :(得分:1)
从设计的角度来看,是否有任何差异,这使得一个更好?
布尔属性更简单,更容易测试。如果未定义,A.special
将导致undefined
已经伪造。
如果您使用某种方法,则需要测试typeof A.special == "function" && A.special()
,因为如果未定义该方法,则只有A.special()
会导致异常。
如果您需要动态计算特殊性(它可能取决于其他属性?)并且不想更新布尔标志以及更新这些属性,那么方法解决方案才会更好。但是,对于这种情况,还有使用getter属性的中间方法(如果您不需要支持旧的IE)。
答案 1 :(得分:0)
访问该属性肯定更快:
this.special = true;
但在A
代码之外,有人可以A.special = false
。没有办法阻止这种情况。
使用方法禁止其他对象修改值。在A
的构造函数中,您可以定义:
...
var special = true;
...
this.isSpecial = function() {return special;};
在现代浏览器中,有一种方法可以充分利用两者:Object.defineProperty
。因此,您可以定义属性并禁止外部源更改它:
Object.defineProperty(this, "special", {value: true, writable: false, configurable: false});
这在IE7及更低版本中不可用,并且在IE8中仅为DOM对象定义并使用get
和set
属性定义:
Object.defineProperty(this, "special", {get: function() {return true;}});
这并不比调用isSpecial
方法快。
答案 2 :(得分:-1)
使用属性A.special = true;
会更快(尽管我怀疑这是一个性能关键的代码片段。)
执行方法A.special = function() {...};
的好处是可以获得一个间接层,并可以在其中放置更高级的逻辑。如,
A.special = function() { return foo && bar && !baz ? true : false; };