zoukankan      html  css  js  c++  java
  • javascript继承的写法

    原文链接:http://js8.in/698.html.

    构造函数继承:

    第一种方法是使用prototype属性:

    这里也可以直接Child.prototype=new P();考虑到P构造函数的参数无法确定,所以使用一个空函数。

    function extend(Child,Parent){
        var F=function(){};
        F.prototype=Parent.prototype;
        Child.prototype=new F();
        Child.prototype.constructor=Child;
    }

    第二种方法则是属性和方法的拷贝:

    function extend(Child,Parent){
        var c=Child.prototype;
        var p=Parent.prototype;
        for(var i in p){
            c[i]=p[i];
        }
    };

    对象继承:

    其实对象继承包括浅拷贝深度拷贝

    浅度拷贝:浅拷贝的对象,其实引用的是同一地址。比如 var a={name:'xiaoqiang'},b={};b=a;b.name='lalala';当我修改了b的时候,a也就发生了改变。

    深度拷贝:深度拷贝后的对象,修改任一对象,另一对象都不受影响。

    浅拷贝示例:

    function lightlyCopy(obj){
        var c={};
        for(var i in obj){
            c[i]=obj[i];
        }
        return c;
    }

    使用prototype进行拷贝:

    function lightlyCopy(obj){
       var F=function(){};
       F.prototype=obj;
       return new F();
    }

    深度拷贝:这个。。。

    // extends 'from' object with members from 'to'. If 'to' is null, a deep clone of 'from' is returned
    function extend(from, to)
    {
        if (from == null || typeof from != "object") return from;
        if (from.constructor != Object && from.constructor != Array) return from;
        if (from.constructor == Date || from.constructor == RegExp || from.constructor == Function ||
            from.constructor == String || from.constructor == Number || from.constructor == Boolean)
            return new from.constructor(from);
    
        to = to || new from.constructor();
    
        for (var name in from)
        {
            to[name] = typeof to[name] == "undefined" ? extend(from[name], null) : to[name];
        }
    
        return to;
    }

    以上参考自:http://stackoverflow.com/questions/122102/most-efficient-way-to-clone-an-object

    实际上,若递归的对象是个数组的话,也只能用for in,因为for是无法枚举到数组的属性成员的。比如:

    var a=[1,3,2];
    a.test='hahahah';
    for(var i=0,len=a.length;i<len;i++){
        console.log(a[i]);//让a.test情何以堪呐
    }

    jquery中也有extend方法,我们通常在写jquery插件时候就会用到。但是,它的第一个参数默认为false,若设置为true,则是深拷贝。

  • 相关阅读:
    正则表达式实例:取得普陀区所有的小区名字和地址
    VS的注释(TODO)
    用本地地址构造出多个虚拟域名
    设置asp.net网站的信任等级
    c#中的多线程和异步处理
    VS2010下MVC4安装
    4、学习《细说PHP》笔记四
    38、UMLet的使用与类图的设计
    1、学习《细说PHP》笔记一
    6、学习《细说PHP》笔记六
  • 原文地址:https://www.cnblogs.com/my_front_research/p/3159532.html
Copyright © 2011-2022 走看看