<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>无标题文档</title>
<script>

//继承 : 子类不影响父类,子类可以继承父类的一些功能 ( 代码复用 )

//属性的继承 : 调用父类的构造函数 call

//方法的继承 : for in :  拷贝继承 (jquery也是采用拷贝继承extend)

function CreatePerson(name,sex){   //父类
	this.name = name;
	this.sex = sex;
}
CreatePerson.prototype.showName = function(){
	alert( this.name );
};

var p1 = new CreatePerson('小明','男');
//p1.showName();


function CreateStar(name,sex,job){  //子类
	
	CreatePerson.call(this,name,sex);
	
	this.job = job;
	
}

//CreateStar.prototype = CreatePerson.prototype;

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];
	}
}
</script>
</head>

<body>
</body>
</html>

  如上面的代码(此代码是视频资料中,自己也有写过一遍...)

js对象的继承要把属性和方法分开继承:

属性的继承 : 调用父类的构造函数 call

方法的继承 : for in : 拷贝继承 (jquery也是采用拷贝继承extend)

属性的继承直接调用父类的构造函数即可

Createperson(this,....);

方法的继承需要用到for  in

不能直接  子类.prototype = 父类.prototype 因为把父类的引用也传递给了子类.子类会影响父类

 

其他继承方式

1.类式继承 

function Aaa(){}//父类

function Bbb(){}//子类

面试中可能会让我们用一句话来完成,Bbb.prototype = new Aaa();

但是这样还存在很多问题,例如Bbb的constructor指向问题。

正确做法应该是

function Bbb(){ Aaa.call(this); }

var F = function(){};
F.prototype = Aaa.prototype;
Bbb.prototype = new F();
Bbb.prototype.constructor = Bbb; //修正指向问题

2.原型继承,适用于非new创建的对象,

var a = {
name : '小明'
};

var b = cloneObj(a);

b.name = '小强';

alert( b.name );
alert( a.name );

function cloneObj(obj){

var F = function(){};

F.prototype = obj;

return new F();

}

posted on 2015-05-02 23:33  toodeep  阅读(185)  评论(0编辑  收藏  举报