使用属性或方法将类标记为特殊类? (在JavaScript中)

时间:2013-04-04 14:31:29

标签: javascript oop

在JavaScript中,我想将对象A标记为特殊,因此当B访问A时,B可以检查是否标记了A,以便B将A视为与其他对象不同。 (认为​​B是处理许多不同对象的序列化程序,A必须以某种方式序列化。)

现在,我也可以 1:在A中设置属性,例如A.special = true
2:定义一个方法,例如A.isSpecial(),如果该方法存在,则表明A是特殊的。

我知道这两件事都是一样的。从设计的角度来看,是否有任何差异,这使得一个更好?

3 个答案:

答案 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对象定义并使用getset属性定义:

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; };