使用原型创建的 JavaScript 对象保持与其原型的“实时”连接,因此更改原型也会影响从它创建的对象。
如果新创建的对象只是从原型中复制所有内容然后忘记它,那么语言的语义会简单得多。当然,实际的底层实现可能更智能。
实时/动态连接的这种特性是否实际用于某些知名的 JavaScript 库或程序中?
编辑:我并不是说 JS 继承系统有缺陷,我只是想了解上述功能的好处。
使用原型创建的 JavaScript 对象保持与其原型的“实时”连接,因此更改原型也会影响从它创建的对象。
如果新创建的对象只是从原型中复制所有内容然后忘记它,那么语言的语义会简单得多。当然,实际的底层实现可能更智能。
实时/动态连接的这种特性是否实际用于某些知名的 JavaScript 库或程序中?
编辑:我并不是说 JS 继承系统有缺陷,我只是想了解上述功能的好处。
一定。我认为这个特性最突出的用途是动态添加方法到 jQuery 原型(称为“插件”),它被暴露为jQuery.fn
.
我不明白为什么你认为“如果新创建的对象只是复制原型属性,语言的语义会简单得多”。为什么会更简单?您可以使用该方法创建对象,使用extend()
函数,但这会颠覆原型继承的概念。
在 Javascript 中具有非静态继承是核心功能之一。修改已生成实例的原型对象很有用:
在最近的一次演讲中,Brendan Eich 将 Javascript 描述为一种“目标”语言,这使得 Jquery 或 CoffeeScript 等库可以在其上编写,库原型用于更快地公开常用函数和方法,查看 javascript很好的原型示例的游戏框架
这种活力存在于修补旧浏览器的 polyfill 库中,例如通过添加Array.prototype.map
或添加来自 ES6 的即将推出的新功能,例如Array.prototype.find
. 有关示例,请参见https://github.com/paulmillr/es6-shim/ 。