JavaScript继承机制
我现在正在学习JS继承,有些事情我还不清楚。 考虑下面的代码: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
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
方法使用哺乳动物
sgetName
?Mozilla有一个很好的参考示例:哺乳动物.call(this,name)
就像Java中的super
关键字一样?@undroid,这是一种看待它的方式。如果您没有执行Cat.prototype=new demal()
然后调用emmal.call(这个,名字),那么您必须小心完成
可以尝试调用此
上不存在的函数。在这种情况下,最佳做法是什么?将name
构造函数添加到Cat
函数中,或通过call
方法使用哺乳动物sgetName
?Mozilla有一个很好的参考示例: