当前位置:  开发笔记 > 编程语言 > 正文

将ES6类getter设置为可枚举

如何解决《将ES6类getter设置为可枚举》经验,为你挑选了1个好方法。

我有一个带有getter属性的ES6类(用babeljs反编译).我知道默认情况下这些属性不可枚举.但是,我不明白为什么我无法使用可枚举的属性Object.defineProperty

// Declare class
class Person {
  constructor(myName) {
    this.name = myName;
  }

  get greeting() {
    return `Hello, I'm ${this.name}`;
  }
}

// Make enumerable (doesn't work)
Object.defineProperty(Person, 'greeting', {enumerable: true});

// Create an instance and get enumerable properties
var person = new Person('Billy');
var enumerableProperties = Object.keys(person);
// => ['name']

Plunker示例



1> Paul..:

ES6风格的getter是在原型上定义的,而不是在每个人身上person.要将greeting属性设置为可枚举,您需要更改:

// Make enumerable (doesn't work)
Object.defineProperty(Person, 'greeting', {enumerable: true});

至:

// Make enumerable
Object.defineProperty(Person.prototype, 'greeting', {enumerable: true});

Object.keys只返回该对象拥有的可枚举属性,因此不返回原型上的属性.你会发现greeting在财产Object.keys( Object.getPrototypeOf( person ) ),或在对...的循环.更新了Plunker

相反,如果您希望Person的每个实例都有自己的实例,greeting您可以在构造函数中定义它:

class Person {
  constructor(myName) {
    this.name = myName;

    Object.defineProperty( this, 'greeting', {
      enumerable: true,
      get: function ( ) { return `Hello, I'm ${this.name}`; }
    } );
  }
}

更新了Plunker


这有效但哇,不直观,甚至不符合逻辑
@SeanVieira不,你不需要.`defineProperty`也可用于修改/配置现有属性.只要你没有指定`value`或新的`get`,设置enumerable就不会阻止旧的`get`工作.(请注意我在第一个关于我的答案的链接器中,'person [name]`正确地返回问候语).
推荐阅读
mobiledu2402852413
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有