关于ESNext装饰器中%PrivateNameSet%及per-realm内置函数对象的问询
关于ESNext装饰器中%PrivateNameSet%的核心问题解答
咱们一步步拆解清楚ES装饰器提案里这个有点抽象的内置概念:
1. 什么是%PrivateNameSet%?
%PrivateNameSet%是ES装饰器提案定义的内部内置函数,属于规范层面的底层工具,不会直接暴露给开发者调用。它的核心作用是在目标对象上关联私有名称(比如类的私有字段、私有方法对应的标识),是装饰器处理私有成员逻辑时的底层支撑函数。
2. 什么是"per-realm内置函数对象"?
首先得理解**Realm(执行域)**的概念:在JavaScript中,每个独立的执行环境就是一个Realm——比如浏览器的主页面、嵌入的iframe,或者Node.js中独立加载的模块上下文,都属于不同的Realm。每个Realm会拥有自己独立的一套内置对象,比如主页面的Object构造函数和iframe里的Object不是同一个引用。
而"per-realm内置函数对象"的意思就是:每个Realm都会拥有自己专属的%PrivateNameSet%实例,不同Realm的%PrivateNameSet%是互相独立的,不会跨域共享。
这里要纠正一个误解:这并不意味着%PrivateNameSet%的this已经绑定为全局对象。内置函数的this绑定规则和普通函数一致——如果作为普通函数调用,非严格模式下this会指向全局对象,严格模式下是undefined;但per-realm的核心是函数实例本身属于某个特定Realm,和其他Realm的同名内置函数不是同一个对象,和this的绑定没有直接关联。
3. %PrivateNameSet%中的O是全局对象吗?
答案是不是。根据规范定义,%PrivateNameSet%的第一个参数O是要操作的目标对象——也就是你需要给它设置私有名称的那个对象。举几个常见场景:
- 当装饰器处理类的实例私有字段时,
O可能是类的原型对象或者实例本身; - 当装饰器处理类的静态私有成员时,
O就是类这个构造函数对象本身。
它完全取决于具体的调用场景,和全局对象没有固定绑定关系。
内容的提问来源于stack exchange,提问作者ENvironmentSet

