尽管阅读了 StackOverflow 上的大多数文章,但我现在实际上对原型(prototype)非常困惑。
function Foo() {
}
Foo.prototype.speak = function() {
console.log('Foo');
};
function Bar() {
}
console.log(Bar.prototype); // {}
Bar.prototype = Object.create(Foo.prototype);
console.log(Bar.prototype); // {} ----- (1)
Bar.prototype.speak = function() { // ----------(2)
console.log('Bar');
};
console.log(Bar.prototype); // { speak: [Function] } ----- (3)
问题:
1) 为什么在Object.create
之后(1)是一个空对象。难道它不应该用 Foo
的 speak 方法
来转换对象吗?
2)我实际上在(2)上改变了什么? Bar
对象还是 prototype
对象?到底发生了什么?
3) (3) 上发生了什么。
4) [[prototype]] 是如何参与这一切的?我所知道的是,如果当前对象不包含属性,则 [[prototype]] 用于查找。
可以肯定的是,.prototype !== [[prototype]]
但 [[prototype]] === __proto__
?
抱歉,如果这是重复的。因为尽管有多个类似的问题,但我似乎无法回答这些问题。
最佳答案
您不能通过简单地尝试分配函数/对象来更改它的原型(prototype)。您需要在创建对象时设置它,或者您应该使用 ES6 功能来更改它。
所以,Bar.prototype = Object.create(Foo.prototype);
没有任何意义。
[[prototype]]
是对象真实原型(prototype)的内部表示。
也许您应该根据这些基本原理重新安排您的测试用例并寻求解释。
关于javascript - .prototype 和 [[prototype]]。为什么 .prototype 是一个空对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36171366/