1. 什么是继承
在原有对象的基础上,略作修改,得到一个新的对象,不影响原有对象的功能。即子类不影响父类,子类可以继承父类的一些功能 ( 代码复用 )
function CreatePerson(name,sex){ //父类
this.name = name;
this.sex = sex;
}
CreatePerson.prototype.showName = function(){
alert( this.name );
};
var p1 = new CreatePerson('小明','男');
p1.showName();//小明
属性的继承 : 调用父类的构造函数 call
方法的继承 : for in : 拷贝继承 (jquery也是采用拷贝继承extend)
一个简单的继承,但是这种继承会影响到父类,即父类也会有showJob
function CreateStar(name,sex,job){ //子类
CreatePerson.call(this,name,sex);
this.job = job;
}
CreateStar.prototype = CreatePerson.prototype;
CreateStar.prototype.showJob = function(){
};
var p2 = new CreateStar('黄晓明','男','演员');
p2.showName();
2. 对象的复制
var a = {
name : '小明'
};
var b = a;
b.name = '小强';
alert( a.name );//小强。因为这里会互相影响
如果是基本类型,比如string,number,则不会出现这样的问题
思路一:‘小明’是字符串,则可以通过字符串赋值来实现
var a = {
name : '小明'
};
var b = {};
for(var attr in a){
b[attr]=a[attr];
}
b.name = '小强';
alert( a.name );//小明。不会影响
可以封装一个函数
var a = {
name : '小明'
};
var b = {};
extend( b , a );
b.name = '小强';
alert( a.name );//小明。不会影响
function extend(obj1,obj2){
for(var attr in obj2){
obj1[attr] = obj2[attr];
}
}
再回到刚才那个问题,进行改写,现在就不会影响父类了
function CreateStar(name,sex,job){ //子类
CreatePerson.call(this,name,sex);
this.job = job;
}
extend( CreateStar.prototype , CreatePerson.prototype );
CreateStar.prototype.showJob = function(){
};
var p2 = new CreateStar('黄晓明','男','演员');
p2.showName();
function extend(obj1,obj2){
for(var attr in obj2){
obj1[attr] = obj2[attr];
}
}
函数和对象类型还是有区别的,函数没办法直接修改,类似于b.push(4);只能改变,类似于b = [1,2,3,4];
继续看下面的例子
var a = [1,2,3];
var b = a;
b.push(4);
alert(a);//[1,2,3,4]
var a = [1,2,3];
var b = a;
b = [1,2,3,4];
alert(a);//[1,2,3]