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

最近翻看博客园,总结了一下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使用的就是深拷贝~

posted @ 2015-10-31 10:04  徐大腿  阅读(798)  评论(0编辑  收藏  举报