
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
据长沙it培训编辑了解到JavaScript作为一个面向对象语言(JS是基于对象的),可以实现继承是必不可少的,但是由于本身并没有类的概念,所以不会像真正的面向对象编程语言通过类实现继承,但可以通过其他方法实现继承;那么JavaScript技术又该怎么学呢?
构造函数是临时新建的对象,用来存储传递过来的对象,F.prototype = proto;将对象实例赋值给F构造函数的原型对象,最后返回传递过来的对象的对象实例。原型式继承还是会共享引用类型的属性。实现继承的方法很多,下面就只是其中的几种。
原型链继承
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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.出现引用共享问题,他们还是共用一个空间,子类会影响父类
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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.在创建子类型的实例时,不能像超类型的构造函数中传递参数。
那么如何解决原型链的两个问题呢?那就继续看下面的继承方式吧!
原型式继承:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
function object(proto) { function F() {} F.prototype = proto; return new F(); }
var person = { name: 'mumu', friends: ['xiaxia', 'susu'] };
var anotherPerson = object(person); anotherPerson.friends.push('wen'); var yetAnotherPerson = object(person); anotherPerson.friends.push('tian'); console.log(person.friends);//["xiaxia", "susu", "wen", "tian"] console.log(anotherPerson.__proto__)//Object {name: "mumu", friends: Array[4]} |
长沙Java培训编辑建议大家注意:在使用原型链实现继承时,不能使用对象字面量创建原型方法,因为这样会中断关系而重写原型链。简单分析下:function object(proto)是一个临时中转函数,里面的参数proto表示将要传递进入的一个对象。