JavaScrip继承
JavaScrip是门面向对象的语言,也有继承的概念。继承有两点有用的服务。1.它是代码重用的一种形式;2.引入类型系统规范。它是门基于原型的语言,意味它的对象可以直接从其他对象继承。它有个伪类的说法。
接下来想写Cat继承Mammal的例子
构造器形式
当一个函数对象被创建的时候,Function构造器产生的函数对象会运行类似于这样子的代码。
this.prototype={constructor:this};
新函数对象被赋予一个prototype属性,属性constructor的属性值为this,this是新函数的对象。prototype对象是存放继承特征的地方。每个函数都会得一个prototype对象。
//定义父类及属性
var Mammal=function(name){
this.name=name;
};
//构造器对象定义方法
Mammal.prototype.get_name=function(){
return this.name;
};
Mammal.prototype.says=function(){
return this.saying||'';
};
//定义子类及属性
var Cat=function(name){
this.name=name;
this.saying='meow';
};
//通过构造器继承父类Mammal,构造函数Mammal()
Cat.prototype=new Mammal();
//子类方法
Cat.prototype.purr=function(n){
var i,s='';
for(i=0;i<n;i+=1){
if(s){
s+='-';
}
s+='r';
}
return s;
};
Cat.prototype.get_name=function(){
return this.says()+' '+this.name+' '+ this.says();
};
初始化运行
缺点:
- 没有私有环境,所有属性都是公开的。
- 无法调用父类方法。
使用构造函数的时候,如果忘了new,那么对象的this会绑定到全局对象上,污染全局环境变量。
//Cat的this绑定到全局对象上,正常运行,污染全局变量。
Cat.prototype=Mammal();
为了降低避免污染全局变量,所有的构造器函数都约定命名在首字母大写的形式。
原型形式
在纯粹的原型模式中,会摒弃类,专注于对象。一个新对象可以继承一个旧对象的属性。当你创建一个新对象时,可以选择某个对象作为它的原型。Object对象的create方法,可以创建一个使用原对象作为其原型的新对象。
//定义对象myMammal
var myMammal={
name:'Herb the Mammal',
get_name:function(){
return this.name;
},
says:function(){
return this.saying||'';
}
};
//定义新对象myCat继承旧对象myMammal,借助Object.create()
var myCat=Object.create(myMammal);
//定义属性
myCat.name='Henrietta';
myCat.saying='meow';
//定义方法
myCat.purr=function(n){
var i,s='';
for(i=0;i<n;i+=1){
if(s){
s+='-';
}
s+='r';
}
return s;
};
myCat.get_name=function(){
return this.says()+' '+this.name+' '+ this.says();
};
- 继承效果图
函数化形式
//定义函数(父类)mammal
var mammal=function(spec){
//定私有义对象that
var that={};
//定义对象下的方法
that.get_name=function(){
return spec.name;
};
that.says=function(){
return spec.saying||'';
};
//返回定义对象给函数
return that;
};
//实例化调用,以{}对象的形式传入参数
var myMammal=mammal({name:'Herb'});
var cat=function(spec){
spec.saying=spec.saying||'meow';
var that=mammal(spec);
that.purr=function(n){
var i,s='';
for(i=0;i<n;i+=1){
if(s){
s+='-';
}
s+='r';
}
return s;
};
that.get_name=function(){
return that.says()+' '+spec.name+' '+that.says();
};
return that;
};
//调用函数,以{}对象的形式传入参数,实例化子类cat
var myCat=cat({name:'Henrietta'});
初始化运行
优点:
- 灵活大
- 更好的封装和隐藏信息