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
属性?
当你请求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 文章,描述它是如何正确完成的
相关文章:
- 从控制器继承了隔离的作用域以生成可重用的指令
- 两个指令创建新的继承的和隔离的作用域-元素得到哪个
- REST的面向公众的身份验证机制
- ES6是否引入了一种机制来生成块范围的函数语句(而不是表达式)
- 当使用控制器作为语法时,如何从父指令继承属性
- 以jquery方式继承Javascript
- JavaScript对象不是从原型链继承的
- 使用Object.create()的角度服务继承
- 数据与Javascript中的继承冲突
- JavaScript对象继承问题
- Javascript嵌套函数属性继承
- 为什么不't htmlCollection从数组继承
- 继承的属性检查
- 在AngularJs中添加轮询机制
- 没有预定义宽度的固定元素最初放在引导容器中,不会从父元素继承宽度
- 如何使用原型继承编写一个整洁灵活的复杂javascript应用程序
- 使用技巧在javascript中强制执行私有继承
- $emit,$broadcast,原型继承
- JavaScript 继承机制
- JS“继承”(代码共享)机制