根据 ES6 速记初始化程序,以下 2 种方法是相同的:
var person = {
name: "Person",
greet: function() {
return "Hello " + this.name;
}
};
var person = {
name: "Person",
greet() {
return "Hello " + this.name;
}
};
ES6 的方式和以前的方式有什么不同吗?如果不是,那么在它们内部使用“super”也应该被视为相等,这不成立,请参阅下面的两个变体:
let person = {
greet(){
super.greet();
}
};
Object.setPrototypeOf(person, {
greet: function(){ console.log("Prototype method"); }
});
person.greet();
let person = {
greet: function(){
super.greet(); // Throw error: Uncaught SyntaxError: 'super' keyword unexpected here
}
};
Object.setPrototypeOf(person, {
greet: function(){ console.log("Prototype method"); }
});
person.greet();
上面两个例子唯一的区别是我们在 person 对象中声明方法greet的方式,应该是相同的。那么,为什么我们会收到错误?
那么,为什么我们会收到错误?
因为
super
仅在方法内有效。 greet: function() {}
是一个“正常”属性/函数,而不是方法,因为它不遵循方法语法。
方法和普通函数定义之间的区别是:
super
。new
调用它们。检查构造函数的拼写 如果您有拼写错误,也可能会出现此错误。
我是通过搜索 V8 错误消息'super'关键字意外来到这里的。以下是错误的可能原因:
super.prop
只能用在简洁方法(foo() {}
、*foo() {}
、async foo() {}
或async *foo() {}
)、访问器(get foo() {}
、set foo() {}
、static get foo(val) {}
或)的主体中static set foo(val) {}
),或constructor() {}
(parser-base.h)。
super
或箭头函数 foo: function() {}
访问 foo: () => {}
。您必须将其转换为简洁的函数foo() {}
。super()
调用只能在派生类 (parser-base.h) 的
constructor() {}
内部。
foo()
来调用超类的 foo()
,那么您可以调用 foo() {super.foo()}
,而不是 foo() {super()}
。class
extends
其他课程。