我正在运行Node 6.9.1。
我定义了一个这样的基础对象:
const base = {
value : 10,
getFinalValue : function() {
return this.value
}
}
现在我想为getFinalValue
方法定义一个修饰符。
我的第一次尝试是使用新的ES6 super
关键字:
const modifier = Object.create(base)
modifier.getFinalValue = function () {
return super.getFinalValue() + 20
}
但是,上面的代码给出了以下错误:
> SyntaxError: 'super' keyword unexpected here
我试过了:
// With Object.defineProperties within Object.create
const modifier = Object.create(base, {
getFinalValue : {
value : function () {
return super.getFinalValue() + 20
}
}
})
// And with Object.setPrototypeOf
const modifier = {
getFinalValue : function () {
return super.getFinalValue() + 20
}
}
Object.setPrototypeOf(modifier, base)
结果是同样的错误。
但是,如果我使用新的ES6方法语法:
const modifier = {
getFinalValue() {
return super.getFinalValue() + 20
}
}
Object.setPrototypeOf(modifier, base)
modifier.getFinalValue() // 30 (yay!)
它运作得很好。
如果我使用Object.getPrototypeOf
代替super
,则可以使用属性语法:
const modifier = {
getFinalValue: function () {
return Object.getPrototypeOf(this).getFinalValue.call(this) + 20
}
}
Object.setPrototypeOf(modifier, base)
modifier.getFinalValue() // 30 (Yay!)
有人可以向我解释为什么会这样吗?
P.S。:是的,我知道我混合了ES5和ES6语法,但这是故意的。
答案 0 :(得分:0)
但是,如果我使用新的ES6方法语法......它可以正常工作。
这就是重点。常规功能中不允许super
。 specification州
如果FormalParameters包含SuperProperty,则为语法错误。
如果FunctionBody包含SuperProperty,则为语法错误。
如果FormalParameters包含SuperCall,则为语法错误。
如果FunctionBody包含SuperCall为真,则为语法错误。
原因是只有在其环境记录中设置字段的方法,才允许JS引擎解析super
的值。方法声明不仅仅是语法糖。