<!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();
}
时间: 2024-11-23 05:01:14