我经常搜索如何在Javascript中执行属性。我见过的大部分揭示模块模式都是专门暴露的功能,根据经验,我知道如果我暴露一个对象,我只是真正得到一个价值的副本然后,因此我只能有一个功能getMyThing()和setMyThing并公开它。但是我想暴露真实的属性
我已经看到了我正在避免的oldschool 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,但是另一个叫做什么?
并且是兼容性图表http://kangax.github.io/es5-compat-table/中提到的get和set关键字“属性初始值设定项中的Getter”和“属性初始化程序中的Setter”?
关于JSfiddle的例子 - http://jsfiddle.net/klumsy/NagbE/1/答案 0 :(得分:1)
您使用的模式看起来不错。它将得到所有ES5浏览器的支持。
对象文字内的get
和set
语法通常称为ES5 对象文字扩展,用于定义访问者属性。访问者属性是由getter和/或setter组成的属性。不是getter / setter的传统类型属性的术语是数据属性。
而且,是的,这就是kangax的兼容性表所指的“......在属性初始化程序中”(如果你鼠标悬停在该页面上带有圆圈的灰色“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
});