JavaScript 继承机制

JavaScript inheritance mechanism

本文关键字:机制 继承 JavaScript      更新时间:2023-09-26

我现在正在学习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 属性?

当你请求JS对象上的属性时,JS将遍历原型链,直到找到该属性。因此,对象继承自其原型。

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

您可以强制显式执行此操作。

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

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

编辑以回应评论:没有类。 :)你把Cat的原型设置为new Mammal(),相当于new Mammal(undefined)。因此,当您调用 getName() 时,您正在调用原型上的getName,并且在该闭包中,name undefined

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

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

看看这篇 MDN 文章,描述它是如何正确完成的