当使用 Node 的 vm.runInNewContext
创建新上下文时,内置(Object
、Function
等)原型(prototype)共享或不是吗?
关于 runInNewContext
的文档说:
Running
code
does not have access to local scope and the objectsandbox
will be used as the global object forcode
.
Object.prototype
是否在全局范围内,因此不共享?
在 node_script.cc:338-345
和 node_script.cc:403-409
中,我看到它在引用对象,那些也是来自 sandbox
的对象,使用调用 vm.runInNewContext
的父上下文的 Object.prototype
和使用不同的在新上下文中创建的对象Object.prototype
?
(注:vm
模块是一个迷宫:vm
模块->evals
process.binding->node_script.cc
源代码)
最佳答案
据我所知,代码是在一个全新的上下文中运行的,对象、数组等具有不同的全局构造函数。
Object.prototype.a = function() { console.log('hello'); };
({}).a(); // 'hello'
require('vm').runInNewContext('({}).a();'); // should throw
如果 Object::a 可以访问原始上下文中的变量,我认为它真的不会成为新上下文。
虽然这有一些含义:
vm.runInNewContext('[];') instanceof Array; // returns false
因为该数组是使用完全不同的构造函数创建的,所以 instanceof 运算符将受到影响。
关于javascript - 共享内置原型(prototype)的 Node JavaScript 上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5875193/