JS getters:defineProperty是否替换或补充较旧的内联"get"'set'语法?

mik*_*ana 1 javascript properties getter-setter ecmascript-5 defineproperty

内联,对象文字'get function()'样式和Object.defineProperty之间的功能似乎有重叠.

MDN docs for get https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/get没有提到内联'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'] || ''
        },
    }
Run Code Online (Sandbox Code Playgroud)

Mozilla的Jeff Walden在2010年(似乎是)的文章中说:

"我们已经删除了对SpiderMonkey和Mozilla中一些过时的getter/setter语法的支持.这不包括{get property(){return"value";},set property(v){}},这是广泛使用的这是最新标准的一部分."

所以:

  • 内联获取/设置好吗?
  • 内联get/set是否已弃用而不支持defineProperty?
  • 我什么时候应该使用?

ZER*_*ER0 6

  • 内联获取/设置都可以
  • 如果赞成defineProperty(__defineGetter__并且__defineSetter__已弃用),它们不会被弃用
  • defineProperty为您提供更多粒度并控制您要定义的属性:您可以决定该属性是否为configurabile,writableenumerable.你不能用get和做set.此外,defineProperty您无法定义必要的getter或setter,只能定义一个值.
  • 使用get并且set当您不需要更多粒度时,它是一种糖语法,并且可以在对象定义本身中使用,defineProperty必须在创建实例后使用.defineProperty在需要更多粒度时使用,或者您不需要指定getter和setter但只需要一个值.

希望能帮助到你.

关于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