我完全不明白这是如何运作的:
function inherit(C,P) {
var F = function () {};
F.prototype = P.prototype;
C.prototype = new F();
}
function Parent(){};
Parent.prototype.species = "human";
function Child(){};
inherit(Child, Parent);
var kid = new Child();
Parent.prototype.talk = function () {return "Hello there!"};
kid对象如何具有talk功能?没有继承功能只给Child" class"你调用继承函数时父类的原型?它是如何更新的?
答案 0 :(得分:2)
inherit
函数执行此操作:
function inherit(C, P) {
var F = function () {}; // Defines a new constructor function.
F.prototype = P.prototype; // Sets `F.prototype` to *be an alias* of `P.prototype`
C.prototype = new F(); // Sets `C.prototype` to *be an instance* of `F`
}
如果您按C
更改Child
,P
更改Parent
,F
更改anonymous class
。它将呈现如下内容:
Child.prototype
是anonymous class
的一个实例,它与Parent
共享相同的原型。
这使得这个陈述成立:Child.prototype.__proto__ === Parent.prototype
。
因此,您对Parent.prototype
所做的任何更改都会被anonymous class
中Child.prototype
的实例看到。因此,这也使得Child
实例也可以访问。
但是,相反的情况并非如此!例如,如果您向Child.prototype
添加属性,则只会更改anonymous class
的实例,并且Parent
的实例无法看到它。
答案 1 :(得分:1)
这里的基本原则是,在Javascript中,当您将一个对象设置为另一个对象时,您只创建对原始对象的引用,而不是该对象的副本。因此,对原始对象的任何更改也将应用于您创建的链接。
这是一个遵循相同原则的简单版本:
var parent = {
"speak": "hello"
}
var child = parent;
parent.shout = "HELLO!"
alert(child.shout); // Will popup 'HELLO!'
因此,当您将Child.prototype设置为等于Parent.prototype时,Child.prototype现在只是对Parent.prototype对象的引用,因此您对其中任何一项所做的任何更改都将适用于两者。