您可以在javascript中扩展本机对象。例如,sugar.js扩展了Array,String和Function等。本机对象扩展可能非常有用,但是会固有地破坏封装-即,如果某人使用相同的扩展名(覆盖另一个扩展),则事情将会中断。
如果可以为特定范围扩展对象,那将是非常好的。例如。能够在node.js中执行以下操作:
// myExtension1.js
Object.prototype.x = 5
exports.speak = function() {
var six = ({}.x+1)
console.log("6 equals: "+six)
}
// myExtension2.js
Object.prototype.x = 20
exports.speak = function() {
var twenty1 = ({}.x+1)
console.log("21 equals: "+twenty1)
}
并拥有这项工作权利:
// test.js
var one = require('myExtension1')
var two = require('myExtension2')
one.speak(); // 6 equals: 6
two.speak(); // 21 equals: 21
当然,实际上,第一个将打印出“6 equals:21”。
有没有办法通过任何机制做一些可能的事情?我感兴趣的机制包括:
最佳答案
不幸的是,您当前无法在节点中执行此操作,因为节点在模块之间共享相同的内置对象。
这很糟糕,因为它可能带来意想不到的副作用,就像过去浏览器历史中发生的那样,这就是为什么现在每个人都在大喊“不要扩展内置对象”。
其他commonJS环境则更多地遵循原始的commonJS规范,因此您不必共享内置对象,但是每个模块都有自己的模块。例如,在jetpack(用于构建Firefox附加组件的Mozilla SDK)中,它的工作方式如下:因此,内置对象是每个模块的对象,如果扩展一个,则不会发生冲突。
无论如何,总的来说,我认为如今并没有必要扩展内置对象,应该避免使用。