JS getters:定义属性替换或补充旧的内联“get”“set”语法

JS getters: does defineProperty replace or complement the older, inline 'get' 'set' syntax?

本文关键字:get 语法 set 定义 getters 属性 替换 JS      更新时间:2023-09-26

联对象文字'get function()'样式和Object.defineProperty之间似乎存在功能重叠。

用于获取 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