2011-09-28 72 views
3

忽略了一个事实,这是由许多框架实现..什么是更好的方法,以原型为多种类型的

什么是原型多个对象类型的最佳途径。

例如,我应该写:

Element.prototype.bind = function(eventType, fn) { 
    this.addEventListener(eventType, fn, false); 
}; 
NodeList.prototype.bind = function(eventType, fn) { 
    for (var i = 0, l = this.length; i < l; i++) { 
     this[i].addEventListener(eventType, fn, false); 
    } 
}; 

Object.prototype.bind = function(eventType, fn) { 
    if (this instanceof Element) { 
     this.addEventListener(eventType, fn, false); 
    } else if (this instanceof NodeList) { 
     for (var i = 0, l = this.length; i < l; i++) { 
      this[i].addEventListener(eventType, fn, false); 
     } 
    } 
} 
+1

http://jsperf.com/prototype-methods好了,我发现,第一种方法是更好的表现,我会承担它也提供了较少的冲突机会? – rlemon

+0

是的,它也更整洁,更容易阅读恕我直言...如果你想在多种类型相同的功能,那么代码是更清洁。想象一下这个Element的实例这个OtherType ||的实例...':O –

+0

最好的地方可能就是这样。你能添加一些上下文吗?你遇到什么问题导致你问这个问题? –

回答

3

红旗:从未延长Object.prototype!它打破for (x in y)(或至少人们对它的工作原理)。

但是,在一般情况下,最好扩展各个类型的原型,而不是尝试找到一个通用基础并执行反射检查。这样做有两个基本原因。首先,JavaScript是一种动态类型语言,所以你通常应该更喜欢鸭子打字和基本继承而不是instanceof和反射。在许多情况下,性能有一点好处,但主要是这样,所以你不用花时间去对抗语言。其次,这种类型的方法切换意味着切换方法之间的连接,这些连接并不一定存在。在你的示例代码中,这可以在NodeList版本中看到。从概念上讲,列表不应该是任何约束力;如果它有bind方法,它应该简单地转化为在其每个元素上调用bind方法。这确保了如果将来需要添加任何额外的步骤(例如,旧的,不符合DOM的浏览器的解决方法...),则只需在一个位置执行此操作。

但在“相同功能”的类型转换角度来看待它给人的假象,既Element.bindNodeList.bind应工作方式相同 - 通过调用addEventListener。以下是我想实现它:

Element.prototype.bind = function(eventType, fn) { 
    this.addEventListener(eventType, fn, false); 
}; 

NodeList.prototype.bind = function(eventType, fn) { 
    for (var i = 0, l = this.length; i < l; i++) { 
     this[i].bind(eventType, fn); 
    } 
}; 
+1

三江源,你要尝试这个没有得到挂在我正在伸出'Object.prototype'事实上的第一人。我将从*开始我明白这样做的意义,但我很欣赏警告*。您的答案中的其他内容完全是我一直在寻找的信息。 – rlemon

相关问题