一些JavaScript库是否使用原型系统的动态方面?

时间:2012-05-15 22:40:45

标签: javascript prototype

使用原型创建的JavaScript对象维护与其原型的“实时”连接,因此更改原型也会影响从其创建的对象。

如果新创建的对象只是复制了原型中的所有内容然后忘记了它,那么语言的语义就会简单得多。当然,实际的底层实现可能更加智能。

实时/动态连接的这个功能是否实际用于一些众所周知的JavaScript库或程序?

编辑:我不是建议JS继承系统存在缺陷,我只是想了解上述功能的好处。

3 个答案:

答案 0 :(得分:5)

当然。我认为这个功能最突出的用途是动态地将方法添加到jQuery原型(称为“插件”),它被公开为jQuery.fn

我无法理解为什么你认为“如果新创建的对象只是复制了原型属性,那么语言的语义就会简单得多”。为什么这会更简单?您可以使用extend()函数创建具有该方法的对象,但这会在头部敲击原型继承的概念。

在Javascript中拥有非静态继承是其中一个核心功能。修改已生成的实例的原型对象非常有用:

  • 添加功能,如上所述。您只能在需要时加载整个插件。
  • 增强功能(有时)。这通常用于覆盖非标准行为
  • 真的改变了他们(很少)。这可以与配置对象一起使用,配置对象从具有默认设置的对象继承。然后你可以更改默认设置,它们将应用于所有实例(至少对那些没有覆盖相关属性的实例)。

答案 1 :(得分:0)

在最近的一次演讲中,Brendan Eich将Javascript描述为一种“目标”语言,使得像Jquery或CoffeeScript这样的库可以在其上面编写,库原型用于更快地暴露常用函数和方法,看看在一个javascript游戏框架内,为原型的很好的例子

答案 2 :(得分:0)

这种动态存在于填充旧浏览器的polyfill库中,例如:通过添加Array.prototype.map,或添加来自ES6的即将推出的新功能,例如: Array.prototype.find。有关示例,请参阅https://github.com/paulmillr/es6-shim/