我已经搜索了很多关于如何在 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/