内联,对象文字“ 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为您提供更多的粒度和对您将要定义的属性的控制:您可以确定该属性是configurabilewritableenumerable。您不能使用getset来做到这一点。另外,使用defineProperty不能定义必需的getter或setter,而只能定义一个值。
当您不需要更多粒度时,请使用getset,它是一种糖语法,可以在对象定义本身中使用,其中在创建实例后必须使用defineProperty。如果需要更多的粒度,或者不需要指定getter和setter,而只需指定一个值,请使用defineProperty


希望能帮助到你。

链接到有关getset的规范

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

09-25 22:11