(js高手之路)原型式继承与寄生式继承

  

<强>一、原型式继承本质其实就是个浅拷贝,以一个对象为模板复制出新的对象

function 对象(,o ) {   ,,,,,,,,,,,var  G =,函数(){};   ,,,,,,,,,,,G.prototype =, o;   ,,,,,,,,,,,return  new  G ();   ,,,,,,,}   ,,,,,,,var  obj =, {   ,,,,,,,,,,,name :,“ghostwu”,   ,,,,,,,,,,,age :, 22日   ,,,,,,,,,,,show :,函数(){   ,,,,,,,,,,,,,,,return  this.name  +,,, +, this.age;   ,,,,,,,,,,,}   ,,,,,,,};   ,,,,,,,var  obj2 =,对象(,obj );   ,,,,,,,console.log (obj2.name的不同之处是,obj.age, obj.show (),),

对象函数中,以对象o为模板,在对象函数体里面,定义一个构造函数,让构造函数的原型对象(原型)指向o,

返回构造函数的一个实例,这样就可以访问到对象o的所有属性和方法。

<强>二,因为原型式继承是个浅拷贝,所以引用类型的数据共享在不同的实例之间

function 对象(,o ) {   ,,,,,,,,,,,var  G =,函数(){};   ,,,,,,,,,,,G.prototype =, o;   ,,,,,,,,,,,return  new  G ();   ,,,,,,,}   ,,,,,,,var  obj =, {   ,,,,,,,,,,,skills :, (, php, javascript的,)   ,,,,,,,};   ,,,,,,,var  obj2 =,对象(,obj );   ,,,,,,,obj2.skills.push (,“python”);   ,,,,,,,var  obj3 =,对象(,obj );   ,,,,,,,console.log (, obj3.skills );,//php, javascript、python

methoda改变了技能数组,obj3的技能结果就是其他实例改变的结果

<强>三,在es5中,新增了一个函数Object.create()实现了原型式继承

var  obj =, {   ,,,,,,,,,,,skills :, (, php, javascript的,)   ,,,,,,,};   ,,,,,,,var  obj2 =, Object.create (, obj );   ,,,,,,,obj2.skills.push (,“python”);   ,,,,,,,var  obj3 =, Object.create (, obj );   ,,,,,,,console.log (, obj3.skills );,//php, javascript、python

<强> <强>四,寄生式继承就是把原型式继承再次封装,然后在对象上扩展新的方法,再把新对象返回

function 对象(,o ) {   ,,,,,,,,,,,var  G =,函数(){};   ,,,,,,,,,,,G.prototype =, o;   ,,,,,,,,,,,return  new  G ();   ,,,,,,,}   ,,,,,,,function  CreateObj (, srcObj ) {   ,,,,,,,,,,,var  dstObj =,对象(,srcObj );   ,,,,,,,,,,,dstObj.sayName =,函数(){   ,,,,,,,,,,,,,,,return  this.userName;   ,,,,,,,,,,,}   ,,,,,,,,,,,return  dstObj;   ,,,,,,,}   ,,,,,,,var  obj =, {   ,,,,,,,,,,,userName :,“ghostwu”,   ,,,,,,,};   ,,,,,,,var  obj2 =, CreateObj (, obj );   null

(js高手之路)原型式继承与寄生式继承