JavaScript继承机制
JavaScript inheritance mechanism
我正在学习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
属性。现在在当前代码配置中,每当我调用 getName
\ speak
方法时,houseCat
都会打印 undefined
。为什么我不能直接使用 name
属性的 Parent class 构造函数?
没有"parent class"。 JavaScript中没有类。构造函数不被继承,只有属性是。
编辑以回应评论:没有类。 :) 您将 Cat
的原型设置为 new Mammal()
,等同于 new Mammal(undefined)
。因此,当您调用 getName()
时,您是在原型上调用 getName
,并且在那个闭包中,name
是 undefined
.
Cat
不继承 Mammal
的构造函数。因此,name
变量在您的情况下未定义。
当你在JS对象上请求属性时,JS会遍历原型链,直到找到属性。所以对象继承自它们的原型。
构造函数只是一个函数。当一个函数(Cat 的构造函数)被执行时,没有规则还调用其他函数(Mammal 的构造函数)。
您可以明确地强制执行此操作。例如
function Cat(name){
Mammal.call(this, name);
this.catStuff = function(){
console.log("cat says mew");
}
}
在 javascript 中获得正确的继承是困难的,如果你想要 instanceof
和其他一些东西工作,你需要同时处理原型和它的构造函数 属性。
看看this MDN article描述它是如何正确完成的
我正在学习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
属性。现在在当前代码配置中,每当我调用 getName
\ speak
方法时,houseCat
都会打印 undefined
。为什么我不能直接使用 name
属性的 Parent class 构造函数?
没有"parent class"。 JavaScript中没有类。构造函数不被继承,只有属性是。
编辑以回应评论:没有类。 :) 您将 Cat
的原型设置为 new Mammal()
,等同于 new Mammal(undefined)
。因此,当您调用 getName()
时,您是在原型上调用 getName
,并且在那个闭包中,name
是 undefined
.
Cat
不继承 Mammal
的构造函数。因此,name
变量在您的情况下未定义。
当你在JS对象上请求属性时,JS会遍历原型链,直到找到属性。所以对象继承自它们的原型。
构造函数只是一个函数。当一个函数(Cat 的构造函数)被执行时,没有规则还调用其他函数(Mammal 的构造函数)。
您可以明确地强制执行此操作。例如
function Cat(name){
Mammal.call(this, name);
this.catStuff = function(){
console.log("cat says mew");
}
}
在 javascript 中获得正确的继承是困难的,如果你想要 instanceof
和其他一些东西工作,你需要同时处理原型和它的构造函数 属性。
看看this MDN article描述它是如何正确完成的