Этот вопрос получен из супер ключевого слова неожиданно здесь
В принятом ответе говорится:
Потому что super действует только внутри методов.
Но в MDN кажется, что эти два оба метода:
let person = {
greeting() {
return "Hello";
}
};
let friend = {
// shorter syntax for method?
greeting() {
return super.greeting() + ", hi!";
}
// method?
// greeting: function() {
// return super.greeting() + ", hi!"; // Throw error: Uncaught SyntaxError: 'super' keyword unexpected here
// }
};
Object.setPrototypeOf(friend, person);
console.log(friend.greeting());
В понимании es6, Начолас говорит:
Попытка использовать
super
вне кратких методов приводит к синтаксической ошибке
Methods
были просто свойствами объекта, которые содержали функции вместо данных.Любая ссылка на
super
использует [[HomeObject]], чтобы определить, что делать. Первый шаг - вызвать Object.getPrototypeOf () для [[HomeObject]], чтобы получить ссылку на прототип. Затем в прототипе ищется функция с таким же именем. Наконец, устанавливается привязка this и вызывается метод.
Кажется, что [[HomeObject]] отличается сокращенным синтаксисом метода? Мне любопытно, почему?
greet: function() {}
, что просто объявление свойства для нормального объекта, вероятно, технически не является методом, насколькоsuper
это касается. Это просто собственность. В любом случае, почему бы просто не использовать синтаксисclass
и избежать всей проблемы. Вам уже требуетсяsuper
, чтобы быть доступным, так что вы не можете рассчитывать наclass
. - person jfriend00   schedule 04.07.2018greet: function() {}
кажется удовлетворяетmethod
определению? Вот что меня смущает. 3. Синтаксисclass
- это другая тема, я просто смотрю книгу и интересуюсь поведениемsuper
. - person Tina Chen   schedule 04.07.2018super()
предназначен для использования сclass
. Если вы его используете именно здесь, то вам не нужно разгадывать ни одной из этих головоломок. - person jfriend00   schedule 04.07.2018super
в инициализаторе объекта / буквальной нотации - person Tina Chen   schedule 04.07.2018super
в литерале объекта, спасибо. - person Tina Chen   schedule 04.07.2018[[HomeObject]]
и затем разрешает использованиеsuper
. Вам нужно будет проследить цепочку определений синтаксиса, чтобы точно узнать, какой синтаксис делает и не приводит кMakeMethod()
вызову или не вызову. MDN не является источником документации - источником является спецификация EMCAScript. - person jfriend00   schedule 04.07.2018