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

时间:2016-03-23 06:40:41

标签: javascript prototype prototype-programming

尽管阅读了StackOverflow上的大部分文章,但我现在对原型非常困惑。

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)为什么(1)Object.create之后的空对象。它不应该使用speak method中的Foo转换对象吗?

2)我实际上在改变什么(2) ?? Bar对象或prototype对象?实际发生了什么?

3)(3)

发生了什么

4)[[prototype]]如何参与所有这些?我所知道的是,如果当前对象不包含属性,[[prototype]]用于查找。

确定,.prototype !== [[prototype]]但是[[prototype]] === __proto__

很抱歉,如果这是重复的话。因为尽管存在多个类似的问题,我似乎无法回答这些问题。

1 个答案:

答案 0 :(得分:-1)

您不能通过简单地尝试分配它来更改函数/对象的原型。您需要在创建对象时设置它,或者您应该使用ES6功能来更改它。

所以,Bar.prototype = Object.create(Foo.prototype);没有任何意义。

[[prototype]]是对象的真实原型的内部表示。

可能您应该根据这些基本原则重新安排您的测试用例并寻求解释。