JavaScript继承学习笔记【新手必看】继承学习笔记【新手必看】
JavaScript作为一个面向对象语言(JS是基于对象的),可以实现继承是必不可少的,但是由于本身并没有类的概念,所以不
会像真正的面向对象编程语言通过类实现继承,但可以通过其他方法实现继承。实现继承的方法很多,下面就只是其中的几
种。
一一. 原型链继承原型链继承
function Person() { //被继承的函数叫做超类型(父类,基类)
this.name='mumu';
this.age='18';
}
Person.prototype.name='susu';//当属性名相同时需就近原则,先在实例里面查找,没找到再到原型里找
function Worker(){ //继承的函数叫做子类型(子类,派生类)
this.job='student';
}
Worker.prototype=new Person();//通过原型链继承,超类型实例化后的对象实例,赋值给子类的原型属性
var p2=new Worker();
console.log(p2.name);
console.log(p2 instanceof Object);//ture 所有的构造函数都继承自Object
以上实现继承关键在于:Worker.prototype=new Person(); 将Worker的原型成为Person的一个实例,通过原型链继承。
注意:在使用原型链实现继承时,不能使用对象字面量创建原型方法,因为这样会中断关系而重写原型链。
原型链继承问题:
1.出现引用共享问题,他们还是共用一个空间,子类会影响父类
function Person() {
this.bodys=['eye','foot'];
}
function Worker(){
}
Worker.prototype=new Person();
var p1=new Worker();
p1.bodys.push('hand');
var p2=new Worker();
console.log(p1.bodys);
console.log(p2.bodys);
2.在创建子类型的实例时,不能像超类型的构造函数中传递参数。
那么如何解决原型链的两个问题呢?那就继续看下面的继承方式吧~
二二. 借用构造函数继承(也叫对象冒充,伪造对象或经典继承)借用构造函数继承(也叫对象冒充,伪造对象或经典继承)
function Person(name,age){
this.name=name;
this.age=age;
this.bodys=['eye','foot'];
}
Person.prototype.showName=function(){
console.log(this.name);