总结javascript继承的两种方式的N中写法

时间:2023-03-08 18:23:09
总结javascript继承的两种方式的N中写法

最近翻看博客园,总结了一下javascript的继承方式:prototype和copy继承方式。

一、prototype方式

当一个函数被创建时,Function构造函数产生的函数会隐式的被赋予一个prototype属性,prototype包含一个constructor对象

而constructor便是该新函数对象(constructor意义不大,但是可以帮我们找到继承关系)

每个函数都会有一个prototype属性,该属性指向另一对象,这个对象包含可以由特定类型的所有实例共享的属性和方法

每次实例化后,实例内部都会包含一个[[prototype]](__proto__)的内部属性,这个属性指向prototype

总结javascript继承的两种方式的N中写法

(以上图片取自叶小钗博客)

二、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使用的就是深拷贝~