我沿着凯尔辛普森的“YouDontKnowJS on frontendmasters.com”,对他的一个例子感到困惑。
下面是示例代码:
function Foo(who){
this.me = who;
}
Foo.prototype.identify = function() {
return "I am " + this.me;
};
function Bar(who) {
Foo.call(this, who);
}
Bar.prototype = Object.create(Foo.prototype);
Bar.prototype.speak = function() {
alert("Hello, " + this.identify() + ".");
}
var b1 = new Bar("b1");
var b2 = new Bar("b2");
b1.speak();
b2.speak();当调用new Bar("b1")时;当调用b1.talk()时,他将向您介绍如何处理原型链
Bar.prototype上调用警报函数,也调用this.identify()。this对象(b1)上找不到它,因此它会查找它的原型。Bar.prototype,它找不到识别方法,所以它再次查找它的原型链。Foo.prototype上找到了识别方法。这是我不清楚的地方。当我们调用Bar.prototype = Object.create(Foo.prototype)时,Bar.prototype现在不应该引用一个新对象,它是Foo.prototype的副本,其中包含identify()方法吗?为什么要在原型链中再往前走一步才能找到Foo.prototype方法呢?
来自文档的Object.create()的官方定义:
Object.create()方法使用指定的原型对象和属性创建一个新对象
发布于 2014-09-28 16:55:25
“当我们调用Bar.prototype = Object.create(Foo.prototype)时,Bar.prototype现在不应该引用一个新对象,它是Foo.prototype的副本。”
Object.create不创建对象的副本,但它创建了对该对象的委托。因此,您必须再将一个级别提升到Foo.prototype,因为这正是Bar.prototype所委派的。
https://stackoverflow.com/questions/26087232
复制相似问题