最近翻看博客园,总结了一下javascript的继承方式:prototype和copy继承方式。javascript
当一个函数被建立时,Function构造函数产生的函数会隐式的被赋予一个prototype属性,prototype包含一个constructor对象java
而constructor即是该新函数对象(constructor意义不大,可是能够帮咱们找到继承关系)jquery
每一个函数都会有一个prototype属性,该属性指向另外一对象,这个对象包含能够由特定类型的全部实例共享的属性和方法函数
每次实例化后,实例内部都会包含一个[[prototype]](__proto__)的内部属性,这个属性指向prototypeprototype
(以上图片取自叶小钗博客)对象
function extend(child,parent)//经过临时构造器继承 { var f=function(){}; f.prototype=parent.prototype; child.prototype=new f(); child.prototype.constructor=child; child.uber=parent.prototype;//uber 相似其余语言里的SuperClass } function extend2(child,parent)//传递superclass { var c=child.prototype; var p=parent.prototype; for(var v in p) { c[v]=p[v]; } child.uber=parent.prototype; } function extendcopy(parent) { var temp={}; for(var t in parent) { temp[t]=parent[temp]; } temp.uber=parent; return temp; } function deepcopy(child,parent) { var c=child||{}; for(var t in parent) { if(typeof parent[t]==="object") { c[t]=(parent[t].constructor==="Array")?[]:{}; deepcopy(c[t],parent[t]); } else { c[t]=parent[t]; } } return c; } function objectextend(o) { function f(){}; f.prototype=o; return new f(); } function objectextend2(o) { function f(){}; f.prototype=o; var n=new f(); n.uber=o; return n; } function extendcopyplus(o,stuff) { function f(){}; f.prototype=o; var n=new f(); n.uber=o; for(var t in stuff) { n[t]=stuff[t]; } return n; }
至于哪一种方式更好,彻底取决于本身的意愿。blog
jquery使用的就是深拷贝~继承