命名访问器属性仅与 getter 和 setter 有关

Are named accessor properties only just about getters and setters

访问器 属性 将键值与一个或两个访问器函数以及一组布尔属性相关联。访问器函数用于存储或检索与 属性 关联的 ECMAScript 语言值。

以上内容来自 ecmascript 规范第 6 版。

由于 javascript 中的所有内容都是对象,并且所有 javascript 属性都被命名为数据属性 (Ndps)(据我所知)...并将访问器属性 (Naps) 命名为Getters 和 Setters 比 getters 和 setters 更适合 Naps。 Ndp 的检索是直接来自像 v8 这样的底层 js 引擎,还是更多关于它在更高级别上的实现?

示例代码:

var stuff = { 'stuff1': 1, 'stuff2': 2 }    // stuff as an Object

stuff.stuff1 // returns 1

Object.defineProperty(stuff, 'stuff3', {
    // defining stuff3's property attributes
    get: function() { return 'Hey! This is from the getter function'}
    enumerable: true,
    configurable: true
})

stuff.stuff1 // returns but how does it

stuff.stuff3 // returns and i know how because it was defined.

stuff的操作还有其他实现吗?

其他参考资料或链接请注明。

除了 GET 或 SET 之外,属性 真的没有什么可以做的,因为事情就是这样运作的(请原谅双关语)。访问器函数提供了这样做的方法,但更重要的是,它们为您提供了一种控制如何完成此操作的方法。例如,GET 函数可能需要您登录或具有某些访问权限。 SET 函数可能会阻止您设置负值,或者只允许登录用户使用它,将事务记录到文件等。

问题比较笼统,我先按照我的理解总结一下,再回答。

Do basic properties, such as {a: 1}.a have a descriptor or similar inner mechanics to Object.defineProperty(obj, 'a', {get: function() { return 1 }});?


在 V8 中,是的。基本属性的描述符等同于 {writable: true, enumerable: true, configurable: true}.

$ node
> var obj1 = {a: 1}
undefined
> Object.getOwnPropertyDescriptor(obj1, 'a')
{ value: 1, writable: true, enumerable: true, configurable: true }

ECMAScript 标准讨论了标准语言特定部分的描述符。至少在 EC5 section 8.10:

The Property Descriptor type is used to explain the manipulation and reification of named property attributes. Values of the Property Descriptor type are records composed of named fields where each field’s name is an attribute name and its value is a corresponding attribute value as specified in 8.6.1.

并且 section 8.6.1 指出:

Attributes are used in this specification to define and explain the state of named properties.

这几乎证实了描述符是驻留在 Object.defineProperty 函数之外的东西,并且是属性访问定义的核心。

我倾向于相信存储值在内存中的实际位置——常规与显式Object.definePropertyd——是特定于实现的(即从哪里它实际上是在规范中未涵盖的值。