我现在正在学习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
可以访问mammalStuff
和catStuff
属性。现在,在当前的代码配置中,只要我调用houseCat
\ undefined
方法,getName
就会打印speak
。为什么我不能直接使用name
属性的父类构造函数?
答案 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
,在该结算中,name
为undefined
。
答案 2 :(得分:1)
Cat
不会继承Mammal
的构造函数。因此,name
变量在您的情况下是未定义的。
答案 3 :(得分:0)
在javascript中获取继承很难,如果你想要instanceof
以及其他一些工作,你需要同时处理原型及其构造函数属性。
查看this MDN article,了解它是如何正确完成的