javascript - .prototype 和 [[prototype]]。为什么 .prototype 是一个空对象?

标签 javascript prototype prototype-programming

尽管阅读了 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)是一个空对象。难道它不应该用 Foospeak 方法 来转换对象吗?

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/

相关文章:

javascript - 何时以及为何使用“调用申请”?

javascript - 单击更改按钮上的文本

javascript - 使用 File API 正常读取文件

javascript - 使用 Javascript 原型(prototype)在对象中添加函数

JavaScript 函数原型(prototype) : Object, 函数,还是两者?

javascript - Sub.prototype = new Base() 与 Sub.prototype = Base.prototype

javascript - 如何知道数组是否包含具有特定 'key' 的对象?

javascript - 用某些字符替换 regExp (Javascript)

javascript - 非常简单的 Javascript 继承

javascript - 使用绑定(bind)强制原型(prototype)函数的上下文