什么类型的对象/属性是原型getter和setter?

时间:2013-12-11 11:45:36

标签: javascript

阅读John Resig's article about Javascript getters and setters我在Javascript中看到了一个我不熟悉的结构:

Field.prototype = {
    get value(){
        return this._value;
    },
    set value(val){
        this._value = val;
    }
};

Prototype是一个像许多其他人一样的对象,但这里的get和set部分似乎并不熟悉。他们提到了什么名字?它们看起来不像对象的典型属性(遵循"key":"value"语法),它们看起来也不像标准函数。

这个简单的语法糖是JS引擎转化为更易识别的东西吗?

更新

我的问题的真正症结在于:由于{ foo(){} }不是有效的语法,因此在给定getset运算符的情况下是什么使它有效? { get foo(){} }

1 个答案:

答案 0 :(得分:4)

我花了一点时间阅读以确定如何使用它,所以虽然@RGraham指出了很多文档(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/get),但我想我会提供一个用法示例

基本上,“get”和“set”运算符允许您覆盖直接访问成员变量时将获得的行为。

这意味着你可以,例如:

  • 提供一个公开名称的成员变量,然后私下以另一个名称存储它。
  • 在存储之前对值执行操作。
  • 提出似乎是成员变量的东西,实际上它是一个函数。

以上所有内容都可以(当然)通过定义对象上的函数来完成,不同之处在于函数必须这样调用。

使用此表示法,即使符号似乎引用成员变量,也会调用这些函数。

我个人不喜欢它 - 我想它可能导致一些非常混乱的代码,特别是在调试时。但是如果你想......那就可以使用它了。

实施例

var Field = {
    get value(){
        return this._value;
    },
    set value(val){
        this._value = val + 1;
    }
};

Field.value = 100

console.log( Field.value );

将输出:

101

在这里小提琴:http://jsfiddle.net/zV8Kf/1/

关于特定的“为什么{ get foo(){} }有效?”问题:

我读到这个:

  • 创建对象
  • 定义无效的功能
  • 分配函数,使其成为'foo'
  • 的getter

这意味着针对此对象的foo引用将返回undefined

您可以在此处查看此行为:

http://jsfiddle.net/VHAhA/

如果你认为getfoo: function的近似值(我知道它不完全,但确实说明了“我将定义一个函数 - 将它分配给它”,那么它是语法上类似于:

{ foo: function foo() {} }

无法将其与{ foo(){} }进行比较,因为在此示例中,您不会告诉JavaScript您将要定义某些内容,也不会告诉您将其放置在何处。