【发布时间】:2019-04-14 06:57:59
【问题描述】:
当我阅读 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)
你能解释一下这个案例为什么有效吗?
【问题讨论】:
标签: javascript inheritance ecmascript-6