//es6
class Example {
constructor(name) {
this.name = name;
}
init() {
const fun = () => { console.log(this.name) }
fun();
}
}
const e = new Example('Hello');
e.init();
//es5
function Example(name) {
'use strict';
if (!new.target) {
throw new TypeError('Class constructor cannot be invoked without new');
}
this.name = name;
}
Object.defineProperty(Example.prototype, 'init', {
enumerable: false,
value: function () {
'use strict';
if (new.target) {
throw new TypeError('init is not a constructor');
}
var fun = function () {
console.log(this.name);
}
fun.call(this);
}
})
通过Object.defineProperty添加属性,要在属性值对象中加入enumerable为true(可枚举),但使用obj.key=value这种方式定义不用,这个方式默认是可枚举的,这样才能在Object.keys(xxx)遍历xxx这个对象的keys时显示,Object.keys(xxx)方法显示的是可枚举属性
如果不加可枚举属性,也可以用Object.getOwnProperty,返回这对象的所有属性,不管是否可枚举。
同时注意:ES6 中的原型方法是不可被枚举的,所以在es6转es5这样的题目中注意加上可枚举属性为false。