JavaScript继承机制

JavaScript inheritance mechanism

我正在学习JS继承,有一些不清楚的地方。 考虑以下代码:

function Mammal(pName){
    var name = pName; //"private" variable name
    this.getName = function(){ //return name via closure
        return name;
    }
    this.mammalStuff = function(){
        console.log("im a mammal!!");
    }
}
Mammal.prototype.speak = function(){
    console.log("im a "+ this.getName()+" !")  //every Mammal can speak
}

function Cat(){
    this.catStuff = function(){
        console.log("cat says mew");
    }
}

Cat.prototype = new Mammal(); //All cat objects inherit all Mammal characteristics

var houseCat = new Cat("Kittie");

现在,houseCat 可以访问 mammalStuffcatStuff 属性。现在在当前代码配置中,每当我调用 getName \ speak 方法时,houseCat 都会打印 undefined。为什么我不能直接使用 name 属性的 Parent class 构造函数?

没有"parent class"。 JavaScript中没有类。构造函数不被继承,只有属性是。

编辑以回应评论:没有类。 :) 您将 Cat 的原型设置为 new Mammal(),等同于 new Mammal(undefined)。因此,当您调用 getName() 时,您是在原型上调用 getName,并且在那个闭包中,nameundefined.

Cat 不继承 Mammal 的构造函数。因此,name 变量在您的情况下未定义。

当你在JS对象上请求属性时,JS会遍历原型链,直到找到属性。所以对象继承自它们的原型。

构造函数只是一个函数。当一个函数(Cat 的构造函数)被执行时,没有规则还调用其他函数(Mammal 的构造函数)。

您可以明确地强制执行此操作。例如

function Cat(name){
    Mammal.call(this, name);
    this.catStuff = function(){
        console.log("cat says mew");
    }
}

在 javascript 中获得正确的继承是困难的,如果你想要 instanceof 和其他一些东西工作,你需要同时处理原型和它的构造函数 属性。

看看this MDN article描述它是如何正确完成的