【问题标题】:es6 propertyIsEnumerablees6 属性IsEnumerable
【发布时间】:2017-06-12 01:38:03
【问题描述】:

通过 es6 类语法创建的公共方法是不可枚举的。 es5 和 es6 写的 getname 方法有什么区别?

function Cat(){
 this.name="cat"
}
Cat.prototype.getname = function() {return this.name}
var cat = new Cat()

class Dog { 
 constructor(){
   this.name="dog"
 } 
 getname() {
   return this.name
 } 
}
var dog = new Dog()

cat.__proto__.propertyIsEnumerable("getname") //true
dog.__proto__.propertyIsEnumerable("getname") //false

【问题讨论】:

    标签: javascript ecmascript-6 ecmascript-5


    【解决方案1】:

    使用obj.property = foo 将属性直接添加到对象将始终创建一个可枚举的属性。

    ES2015 类语法不这样做。

    要(部分)在 ES5 中复制 ES2015 功能,您必须使用 Object.defineProperty(Cat.prototype, 'getname', ...) 添加 getname 方法

    【讨论】:

    • ES2015 中的行为不同是否有原因。如果类语法只是语法糖,那么 proto 中链接的方法不应该是可枚举的吗?
    • 它是定义原型链的语法糖,但如果你使用Object.defineProperty,你也可以在 ES5 中使它们不可枚举。
    • 对不起,这是对 Viswesh 的回复,而不是对答案的批评。
    • @Alnitak 有什么方法可以枚举类语法中的公共方法吗?
    • @Viswesh 您可以使用Object.getOwnPropertyNames(Dog.prototype) 获取所有属性(可枚举或其他)的数组,但是您必须检查每个属性以确定它是值属性还是方法。
    【解决方案2】:

    正如你所说,ES6 类方法是不可枚举的。另一个区别是它们不可构造:

    new cat.__proto__.getname; // works
    new dog.__proto__.getname; // throws a TypeError
    

    此外,类中的方法代码始终为 strict mode 代码,并且可以利用某些语言功能,例如 super 关键字。

    【讨论】:

    • 也很高兴澄清 supernew 限制也适用于对象方法:)
    猜你喜欢
    • 2016-11-05
    • 1970-01-01
    • 2015-12-09
    • 2016-04-03
    • 1970-01-01
    • 2018-10-03
    • 2019-05-22
    • 2016-01-11
    • 2017-10-20
    相关资源
    最近更新 更多