gpt4 book ai didi

javascript - 在 ES6 类语法中,为什么 setPrototypeOf() 起作用而其他类似方法不起作用

转载 作者:行者123 更新时间:2023-12-01 01:05:37 35 4
gpt4 key购买 nike

当我阅读 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

我认为这很奇怪,因为使用正常的原型(prototype)语法 Object.create() 效果很好。而且 Book.prototype 是对象,所以我看不出有什么理由不能添加这样的原型(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)

你能解释一下这个案例为什么它有效吗?

最佳答案

当您使用 class 语法时,生成的构造函数的 prototype 属性不可写且不可配置。这意味着您无法为其分配新值,无论是通过赋值表达式还是通过 Object.defineProperty

class Book {}

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

<小时/>

Can you explain me about this case why it work?

LibraryBook.prototype = Object.create(Book.prototype) 无效。您可以将其删除并获得相同的结果。 LibraryBook.prototype 已经是一个以 Book.prototype 作为其原型(prototype)的对象。这就是 ... extends Book 子句的作用。

class Book {}
class LibraryBook extends Book {}

console.log(Object.getPrototypeOf(LibraryBook.prototype) === Book.prototype);

关于javascript - 在 ES6 类语法中,为什么 setPrototypeOf() 起作用而其他类似方法不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55672740/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com