您可以在 javascript 中扩展 native 对象。例如,sugar.js扩展数组、字符串和函数等等。 native 对象扩展可能非常有用,但本质上会破坏封装 - 即,如果有人使用相同的扩展名称(覆盖另一个扩展),事情就会中断。
如果您可以为特定 范围扩展对象,那就太好了。例如。能够在 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”。
有没有办法,通过任何机制,做一些可能的事情?我感兴趣的机制包括:
- 纯javascript
- Node.js
- Node.js 的 C++ 扩展
最佳答案
不幸的是,您目前无法在 Node 中执行此操作,因为 Node 跨模块共享相同的内置对象。
这很糟糕,因为它可能会带来意想不到的副作用,就像它发生在过去的浏览器历史中一样,这就是为什么现在每个人都在大喊“不要扩展内置对象”。
其他 commonJS 环境更多地遵循原始的 commonJS 规范,因此您不会共享内置对象,但每个模块都有自己的。例如在 jetpack 中,用于构建 Firefox 附加组件的 Mozilla SDK,它以这种方式工作:所以你的内置对象是每个模块的,如果你扩展一个你就不会发生冲突。
无论如何,总的来说,我认为现在扩展内置对象并不是真正必要的,应该避免。
关于javascript - 有没有办法在 javascript 中隔离 native 对象扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17780966/