理解Javascript中的经典继承

时间:2014-11-08 23:54:11

标签: javascript inheritance

我完全不明白这是如何运作的:

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"你调用继承函数时父类的原型?它是如何更新的?

2 个答案:

答案 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更改ChildP更改ParentF更改anonymous class。它将呈现如下内容:

Child.prototypeanonymous class的一个实例,它与Parent共享相同的原型。

这使得这个陈述成立:Child.prototype.__proto__ === Parent.prototype

因此,您对Parent.prototype所做的任何更改都会被anonymous classChild.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对象的引用,因此您对其中任何一项所做的任何更改都将适用于两者。