3

我已经搜索了很多关于如何在 Javascript 中执行属性的方法。我见过的大多数揭示模块模式都只暴露了函数,根据经验,我知道如果我暴露了一个对象,我只是真的在那里得到了一个值的副本,因此我可以有一个函数getMyThing() 和 setMyThing 并公开它。但是我想暴露真实的属性

我已经看到了我正在避免使用的老式defineGetter和较新的 Object.defineProperty( 我遇到了一些真正的麻烦。(我可以很容易地将它用于一个人工对象,但不能在我的“模块”中使用它,也不是在我的我想揭示的模块。

var myobj = (function() {  
    var name = "default name"
    var sayName = function() { return "hello " + name }
  return {
   badname : name, //this won't change
   sayName : sayName,
   get name() { return name;},
   set name(value) { name = value ;}

  }
})()
alert("should be default because its just a copy: " + myobj.badname)
alert("should be default: " + myobj.name)
myobj.name = "karl"
alert("should be default because its just a copy: " + myobj.badname)
alert("should be karl: "  + myobj.name)

无论如何,我在一些地方看到您可以使用 get 和 set 关键字,并且我有以下示例至少在 Firefox 和 ie10 中对我有用。

我的问题:这是一种可以接受的方法,还是有我不知道的隐藏陷阱。这是现代浏览器最能接受的方法吗?这个功能叫什么?Object.defineProperty 功能的正式名称是什么?我假设 get 和 set 关键字的使用是 ECMAScript5 的 getter 和 setter,但是另一个叫什么?

在“属性初始化程序中的Getter”和“属性初始化程序中的Setter”类别下,此兼容性图表http://kangax.github.io/es5-compat-table/中提到的get和set关键字是什么?

JSfiddle 上的示例 - http://jsfiddle.net/klumsy/NagbE/1/

4

1 回答 1

1

您使用的模式看起来不错。所有 ES5 浏览器都将支持它。

对象字面量中的getandset语法通常被称为 ES5对象字面量扩展,用于定义访问器属性。访问器属性是由 getter 和/或 setter 组成的属性。不是 getter/setter 的传统属性的术语是数据属性

而且,是的,这就是 kangax 的兼容性表所指的“... in property initializer”(如果您在该页面上将鼠标悬停在灰色“c”上并在其周围有一个圆圈,您可以看到正在执行的实际测试跑)。

提供的元属性特性Object.defineProperty称为属性描述符。ES5 中有两种属性描述符:数据描述符访问器描述符,它们由以下描述符属性组成:


数据描述符: value, writable, enumerable,configurable

例子:

Object.defineProperty(obj, 'prop', {
    value: 'some value',
    writable: true,
    enumerable: false,
    configurable: true
});

访问器描述符: get, set, enumerable,configurable

例子:

Object.defineProperty(obj, 'prop', {
    get: function() { return 'foo'; },
    set: function() { /* do something... */ },
    enumerable: false,
    configurable: true
});
于 2013-04-28T00:21:37.427 回答