Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/438.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript继承机制_Javascript_Inheritance - Fatal编程技术网

JavaScript继承机制

JavaScript继承机制,javascript,inheritance,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 m

我现在正在学习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
可以访问
matestuff
catStuff
属性。现在,在当前代码配置中,
houseCat
每当我调用
getName
\
speak
方法时,都会打印
undefined
。为什么我不能直接为
名称
属性使用父类构造函数?

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

编辑以响应注释:没有类。:)您将
猫的原型设置为
新哺乳动物()
,这相当于
新哺乳动物(未定义)
。因此,当您调用
getName()
时,您是在原型上调用
getName
,在这个闭包中,
name
未定义的
没有“父类”。JavaScript中没有类。构造函数不是继承的,只有属性是继承的


编辑以响应注释:没有类。:)您将
猫的原型设置为
新哺乳动物()
,这相当于
新哺乳动物(未定义)
。因此,当您调用
getName()
时,您正在原型上调用
getName
,并且在该闭包中,
name
未定义的

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

Cat
不会继承
哺乳动物的构造函数。因此,在您的例子中,
name
变量是未定义的。

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

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

你可以强迫它明确地发生。e、 g

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

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

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

你可以强迫它明确地发生。e、 g

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

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


请看一看如何正确地完成它

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


看一看如何正确地完成它

这意味着每个“类”都必须有自己的构造函数?这意味着每个“类”都必须有自己的构造函数?
哺乳动物调用(这个,名字)
就像Java中的
super
关键字一样?@undroid,这是一种看待它的方式。如果您没有执行
Cat.prototype=new demal()
然后调用
emmal.call(这个,名字),那么您必须小心完成
可以尝试调用此
上不存在的函数。在这种情况下,最佳做法是什么?将
name
构造函数添加到
Cat
函数中,或者通过
call
方法使用
哺乳动物
s
getName
?Mozilla有一个很好的参考示例:
哺乳动物.call(this,name)
就像Java中的
super
关键字一样?@undroid,这是一种看待它的方式。如果您没有执行
Cat.prototype=new demal()
然后调用
emmal.call(这个,名字),那么您必须小心完成
可以尝试调用此
上不存在的函数。在这种情况下,最佳做法是什么?将
name
构造函数添加到
Cat
函数中,或通过
call
方法使用
哺乳动物
s
getName
?Mozilla有一个很好的参考示例: