内联,对象文字“ get function()”样式和Object.defineProperty之间似乎在功能上存在重叠。
用于get https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/get的MDN文档没有提到内联的“ get”功能已被弃用。
var john = {
firstName: 'John',
lastName: 'Smith',
age: 21,
gender: 'Male'
// () → String
// Returns the full name of object.
get name() {
return this.firstName + ' ' + this.lastName
},
// (new_name:String) → undefined
// Sets the name components of the object,
// from a full name.
set name(new_name) {
var names = new_name.trim().split(/\s+/)
this.firstName = names['0'] || ''
this.lastName = names['1'] || ''
},
}
Mozilla的Jeff Walden在2010年(貌似)中的这篇文章指出:
“我们已在SpiderMonkey和Mozilla中删除了对一些过时的getter / setter语法的支持。这不包括{get property(){return“ value”;},set property(v){}},这已被广泛使用并且是最新标准的一部分。”
所以:
内联获取/设置可以吗?
内联获取/设置是否已弃用,转而使用defineProperty?
我什么时候应该使用?
最佳答案
内联获取/设置都可以
如果赞成defineProperty
(不赞成使用__defineGetter__
和__defineSetter__
),则不反对使用它们defineProperty
为您提供更多的粒度和对您将要定义的属性的控制:您可以确定该属性是configurabile
,writable
和enumerable
。您不能使用get
和set
来做到这一点。另外,使用defineProperty
不能定义必需的getter或setter,而只能定义一个值。
当您不需要更多粒度时,请使用get
和set
,它是一种糖语法,可以在对象定义本身中使用,其中在创建实例后必须使用defineProperty
。如果需要更多的粒度,或者不需要指定getter和setter,而只需指定一个值,请使用defineProperty
。
希望能帮助到你。
链接到有关get
和set
的规范
ES5:http://www.ecma-international.org/ecma-262/5.1/#sec-11.1.5
ES6(草稿):http://people.mozilla.org/~jorendorff/es6-draft.html#sec-method-definitions-static-semantics-propname