JavaScript继承机制

时间:2015-01-19 15:09:44

标签: javascript inheritance

我现在正在学习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属性。现在,在当前的代码配置中,只要我调用houseCat \ undefined方法,getName就会打印speak。为什么我不能直接使用name属性的父类构造函数?

4 个答案:

答案 0 :(得分:3)

当您在JS对象上请求属性时,JS将遍历原型链,直到找到该属性。所以对象继承自原型。

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

您可以强制执行此操作。 e.g。

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

答案 1 :(得分:1)

没有“父类”。 JavaScript中没有类。构造函数不是继承的,只有属性。

编辑回应评论:没有课程。 :)您将Cat的原型设置为new Mammal(),相当于new Mammal(undefined)。因此,当您致电getName()时,您正在原型上调用getName,在该结算中,nameundefined

答案 2 :(得分:1)

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

答案 3 :(得分:0)

在javascript中获取继承很难,如果你想要instanceof以及其他一些工作,你需要同时处理原型及其构造函数属性。

查看this MDN article,了解它是如何正确完成的