1

Кажется, что существует перекрытие функциональности между встроенным, объектным литералом 'get function()' style и Object.defineProperty.JS getters: does defineProperty заменяет или дополняет старый, встроенный синтаксис 'get' 'set'?

MDN docs для получения 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'] || '' 
     }, 
    } 

Эта статья от Mozilla Джефф Walden в (что, кажется) 2010 заявил:.

«Мы удалили поддержку нескольких устаревших геттер/сеттер синтаксисах в SpiderMonkey и Mozilla Это делает не включать {get property() {return "value";}, установить свойство (v) {}}, которое широко используется и входит в состав последнего стандарта. "

Итак:

  • инлайн Get/Set OK?
  • Является ли inline get/set устаревшим в пользу defineProperty?
  • Когда я должен использовать каждый?

ответ

6
  • рядных получить/комплект КИ
  • они не рекомендуются, если польза от defineProperty (__defineGetter__ и __defineSetter__ устарели)
  • defineProperty дает вам большую степень детализации и контроль над имуществом вы находитесь собираюсь определить: вы можете решить, является ли имущество configurabile, writable и enumerable. Вы не можете сделать это с get и set. Кроме того, с defineProperty вы не могли определить необходимый геттер или сеттер, а просто значение.
  • Используйте 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

+0

Это супер исчерпывающий ответ, спасибо! Можете ли вы предоставить ссылку для «получения», которая все еще находится в текущей спецификации? Я искал спецификацию ES5, но ее сложно найти ... – mikemaccana

+0

Я только что обновил ответ. – ZER0