最近翻看博客园,总结了一下javascript的继承方式:prototype和copy继承方式。
一、prototype方式
当一个函数被创建时,Function构造函数产生的函数会隐式的被赋予一个prototype属性,prototype包含一个constructor对象
而constructor便是该新函数对象(constructor意义不大,但是可以帮我们找到继承关系)
每个函数都会有一个prototype属性,该属性指向另一对象,这个对象包含可以由特定类型的所有实例共享的属性和方法
每次实例化后,实例内部都会包含一个[[prototype]](__proto__)的内部属性,这个属性指向prototype
(以上图片取自叶小钗博客)
二、copy方式
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; }
至于哪种方式更好,完全取决于自己的意愿。
jquery使用的就是深拷贝~