您的位置:首页 > Web前端 > JavaScript

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

2015-10-31 10:04 597 查看
最近翻看博客园,总结了一下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使用的就是深拷贝~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: