对象继承其他对象的方法和属性

一个扩展函数,用来将第二个参数及以后的属性、方法拷贝给第一个函数;

<script>
//    var extend=(function(){}());  这是格式
    var extend=(function(){
        var p;
        var result=p in {toString:null};
        if(result){ //检测p是否存在toString属性,这是一个检测  看是否可以可枚举 所以用toString这个为代表
            return function extend(o){
                for(var i=1;i<arguments.length;i++){ //这里采用i=1 开始 是因为第一位0 是o;后面的所有存在的函数都是为o提供方法和属性的,给o扩展;
                    var source=arguments[i];
                    for(var prop in source){
                        o[prop]=source[prop]; //这里才是复制属性方法给o;
                    }
                }
                return o;
            };
        }
        //如果p不存在 可以枚举到toString
        else{
            return function pathed_extend(o){
                for(var i=1;i<arguments.length;i++){
                    var source=arguments[i];
                    for(var prop in source){
                        o[prop]=source[prop];
                    };
                };
//                这里定义要检查的特殊属性 之前没法自动枚举到 
                var protoprops=['toString','valueOf','constructor','hasOwnproperty','isPrototypeOf','propertyIsEnmerable','toLocalString'];
                for(var j=0;j<protoprops.length;j++){
                    prop=protoprops[j];
                    if(source.hasOwnProperty(prop)){
                        o[prop]=source[prop];
                    }
                }
                return o;
            }
        }
    }());
    //测试 定义一个空对象
    var arr={};
    var b={
        speak:'1',
        name:'b',
        run:function(){
            var that=this;
            alert(this.name+'正在run');
        }
    };
    var c={
        sleep:function(){
            alert('睡觉');
        }
    }
    //arr.run(); //未拷贝之前 报错
    extend(arr,b); //拷贝b的方法和属性
    arr.name="arr"; //自定义新的属性
    arr.run(); //测试拷贝的方法
    
    extend(arr,b,c); //测试多个参数 能不能继承到C的方法
    arr.sleep(); //可以
    
</script>

 2、jq中也提供了extend()方法。

用法是$.extend(第一个参数是要添加方法的函数,可以使空函数,{这个里面添加要扩展的方法用  键值对形式});

例子:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
    </body>
</html>
<script src="js/jquery-3.0.0.js"></script>
<script>
    function setjs(){};
    $.extend(setjs,{
        adad:function(a,b){
            return a+b;
        }
    });
    var r=setjs.adad(1,2);
    console.log(r);
//    构造函数时
    $.extend(setjs.prototype,{
        adad:function(a,b){
            return a+b;
        }
    });
    var sets=new setjs();
    var r=sets.adad(1,2);
    console.log(r);
</script>

 

posted @ 2016-10-15 11:31  盖大楼  阅读(221)  评论(0编辑  收藏  举报