В синтаксисе класса ES6 почему setPrototypeOf () работают, а другие подобные методы не - PullRequest
0 голосов
/ 14 апреля 2019

Когда я читаю MDN (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes#Sub_classing_with_extends) о наследовании свойства в классе, они говорят, что мне нужно использовать Object.setPrototypeOf()

class Book {
  constructor(title) {
    this.name = "Book";
    this.title = title;
  }
}

Object.setPrototypeOf(Book.prototype, {
  state: 'OH',
  country: 'US'
})

let newBook = new Book('Lolita')
console.log(newBook.state) //OH

Но когда я проверяю MDN о Object.setPrototypeOf(), они говорят, что он медленный и должен использовать какой-то другой, например Object.create().Но когда я пытаюсь это не работает

class Book {
  constructor(title) {
    this.name = "Book";
    this.title = title;
  }
}

Book.prototype = Object.create({
  state: 'OH',
  country: 'US'
})

let newBook = new Book('Lolita')
console.log(newBook.state) //undefined

Я думаю, что это довольно странно, поскольку обычный синтаксис прототипа Object.create() работает хорошо.А Book.prototype - это объект, поэтому я не вижу причин, по которым я не могу добавить такой прототип.

Примечание : после прочтения первого ответа от @Felix это кажетсяразумный.Но когда я попытался немного изменить код, я нашел другое место, где он не должен работать, а получается, что он работает

class Book {
  constructor(title) {
    this.name = "Book";
    this.title = title;
  }
}

Object.setPrototypeOf(Book.prototype, {
  state: 'OH',
  country: 'US'
})

class LibraryBook extends Book{}
LibraryBook.prototype = Object.create(Book.prototype)
let firstBook = new LibraryBook('Lolita')
console.log(firstBook.state)

Можете ли вы объяснить мне этот случай, почему он работает?

1 Ответ

2 голосов
/ 14 апреля 2019

При использовании синтаксиса class свойство prototype результирующей функции конструктора имеет значение , недоступное для записи и не настраиваемое . Это означает, что вы не можете присвоить ему новое значение ни через выражение присваивания, ни через Object.defineProperty.

class Book {}

console.log(Object.getOwnPropertyDescriptor(Book, 'prototype'));

Можете ли вы объяснить мне об этом случае, почему он работает?

LibraryBook.prototype = Object.create(Book.prototype) не имеет никакого эффекта. Вы можете удалить его и получить тот же результат. LibraryBook.prototype уже является объектом, у которого Book.prototype в качестве прототипа. Это то, что делает предложение ... extends Book.

class Book {}
class LibraryBook extends Book {}

console.log(Object.getPrototypeOf(LibraryBook.prototype) === Book.prototype);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...