javascript - 有没有办法在 javascript 中隔离 native 对象扩展?

标签 javascript node.js oop

您可以在 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/

相关文章:

javascript - 使用 Node.js 读写 vcard

node.js - 当所需文件不导出任何内容时,require() 会做什么?设置 Mongoose + express 的正确方法是什么?

javascript - Object.keys() 在 ng-options 中不起作用

javascript - JavaScript ES6 中大数据异步迭代的习惯用法

node.js - Angular 2 和 NodeJs - 使用 Angular 2 中的数据库连接变量调用 NodeJs 函数

java - 在jsp页面中调用bean方法

C++多个类继承自基类导致问题

c++ - 从它之后声明的另一个成员数据初始化一个成员数据是未定义的行为吗?

javascript - 使用 JS 更改内联样式与更改外部样式表样式

javascript - 在柏树中,测试中的拦截不起作用