WEB开发网
开发学院网页设计JavaScript javascript设计模式交流 阅读

javascript设计模式交流

 2010-09-14 13:17:22 来源:WEB开发网   
核心提示: 对js来说 实现clone还有另外一种方式,在javascript中,javascript设计模式交流(2),构造器的prototype属性指明了某一类的原型,当实例化时,对Function来说,完全产生一个副本是不可能的,这一原型被作为对象的原型使用,特别地

对js来说 实现clone还有另外一种方式,在javascript中,构造器的prototype属性指明了某一类的原型,当实例化时,这一原型被作为对象的原型使用。特别地,这个prototype对象也可能是从某一原型构造出来的,这形成了一个类似继承的结构,所以javascript的面向原型特性又被称作原型继承(尽管我很不赞同这种做法,还是要提一下)。

回到我们前面的Prototype Pattern,javascript天生的引用型原型继承为我们提供了另外一种clone的实现方式:

functionobjectPrototypeClone()
    {
        vartmp=function(){};
        tmp.prototype=this;
        returnnewtmp;
    }

这样clone出来的对象只读地共享一个原型的属性,它的最大优势是速度非常快,当我们希望快速复制大型对象时,可以使用这种方式,但是它会造成访问速度降低,而且它实时反映父节点的变化。

内置对象的clone

但是,到这里为止,我们还没有考虑内置对象,内置对象不能用普通方法clone 我们要考虑的内置对象有这么几个:

Function Array String Boolean Number Date

RegExp Error和Math没有需要clone的场景 所以不在我们的考虑之中。

对Function来说,完全产生一个副本是不可能的,因为我们无法保证构造的函数跟原来的函数在同一作用域,但是不包含作用域的实现是很容易的:

eval(this);

或者使用Function构造

return Function(new String("return ")+this)();

Function本身是个Object 因此必须加上Object的clone 实现functionPrototypeClone需要一点小花招

/************************************/
    functionfunctionClone()
    {
        varret=Function(newString("return")+this)();
        for(varpinthis)
        {
            ret[p]=this[p];
        }
        returnret;
    }
/************************************/
    functionfunctionDeepClone()
    {
        varret=Function(newString("return")+this)()
        for(varpinthis)
        {
            if(typeofret[p]!=object)ret[p]=this[p];
            ret[p]=objectDeepClone.call(this[p]);
        }
        returnret;
    }
/************************************/
    functionfunctionPrototypeClone()
    {        
        vartmp=Function.prototype;
        Function.prototype=this;
        varret=(newFunction(newString("return")+this))();
        Function.prototype=tmp;
        returnret;
    }
/************************************/

上一页  1 2 3 4 5 6 7  下一页

Tags:javascript 设计模式 交流

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接