对象继承其他对象的方法和属性
一个扩展函数,用来将第二个参数及以后的属性、方法拷贝给第一个函数;
<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>