Почему [[HomeObject]] отличается сокращенным синтаксисом метода? - PullRequest
0 голосов
/ 04 июля 2018

Этот вопрос является производным от неожиданного супер ключевого слова здесь

В принятом ответе говорится:

Потому что 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]] отличается в сокращенном синтаксисе метода? Мне интересно, почему?

1 Ответ

0 голосов
/ 04 июля 2018

Во-первых, MDN не является официальной документацией по Javascript. Хотя это часто полезно, это не является окончательным источником всего, что связано с языком. Эта официальная спецификация будет в спецификации ECMAScript . Вот где определяется грамматика Javascript.

В этом документе есть нечто, называемое MethodDefinition . Существует несколько синтаксисов, которые можно использовать для определения метода. Синтаксис greeting() {} является одним из таких синтаксисов, который можно использовать для MethodDefinition. Типичное определение буквенного свойства объекта propName: function() {} - это не так. Вот как это определяется:

enter image description here

Затем, чтобы увидеть, что такое MethodDefinition, вы идете в раздел 14.3.8 , где он документирует шаги для MethodDefinition следующим образом:

enter image description here

На шаге 7 он вызывает MakeMethod(). Если вы перейдете к этой части спецификации , вы увидите, что здесь установлено значение [[HomeObject]].

enter image description here

Итак, как вы уже обнаружили, super полагается на то, что [[HomeObject]] устанавливается и просматривает спецификацию, это единственный способ установить его. Таким образом, чтобы super был разрешен, он должен вызвать MakeMethod(), и единственный способ MakeMethod() вызывается с одним из приведенных выше синтаксисов, а обычный синтаксис литерала объекта для свойства, такого как propName: fn, не из них.

...