js中继承的几种用法总结(apply,call,prototype)


Posted in Javascript onDecember 26, 2013

一,js中对象继承

js中有三种继承方式

1.js原型(prototype)实现继承

<SPAN style="BACKGROUND-COLOR: #ffffff"><SPAN style="FONT-SIZE: 18px"><html>  
<body>  
<script type="text/javascript">  
    function Person(name,age){  
        this.name=name;  
        this.age=age;  
    }  
    Person.prototype.sayHello=function(){  
        alert("使用原型得到Name:"+this.name);  
    }  
    var per=new Person("马小倩",21);  
    per.sayHello(); //输出:使用原型得到Name:马小倩        
    function Student(){}  
    Student.prototype=new Person("洪如彤",21);  
    var stu=new Student();  
    Student.prototype.grade=5;  
    Student.prototype.intr=function(){  
        alert(this.grade);  
    }  
    stu.sayHello();//输出:使用原型得到Name:洪如彤  
    stu.intr();//输出:5  
</script>  
</body>  
</html></SPAN></SPAN> 

2.构造函数实现继承
<SPAN style="FONT-SIZE: 18px"><html>  
<body>  
<script type="text/javascript">  
    function  Parent(name){  
        this.name=name;  
        this.sayParent=function(){  
            alert("Parent:"+this.name);  
        }  
    }      function  Child(name,age){  
        this.tempMethod=Parent;  
        this.tempMethod(name);  
        this.age=age;  
        this.sayChild=function(){  
            alert("Child:"+this.name+"age:"+this.age);  
        }  
    }  
    var parent=new Parent("江剑臣");  
    parent.sayParent(); //输出:“Parent:江剑臣”  
    var child=new Child("李鸣",24); //输出:“Child:李鸣 age:24”  
    child.sayChild();  
</script>  
</body>  
</html></SPAN>

3.call , apply实现继承
<SPAN style="FONT-SIZE: 18px"><html>  
<body>  
<script type="text/javascript">  
    function  Person(name,age,love){  
        this.name=name;  
        this.age=age;  
        this.love=love;  
        this.say=function say(){  
            alert("姓名:"+name);  
        }  
    }      //call方式  
    function student(name,age){  
        Person.call(this,name,age);  
    }  
    //apply方式  
    function teacher(name,love){  
        Person.apply(this,[name,love]);  
        //Person.apply(this,arguments); //跟上句一样的效果,arguments  
    }  
    //call与aplly的异同:  
    //1,第一个参数this都一样,指当前对象  
    //2,第二个参数不一样:call的是一个个的参数列表;apply的是一个数组(arguments也可以)  
    var per=new Person("武凤楼",25,"魏荧屏"); //输出:“武凤楼”  
    per.say();  
    var stu=new student("曹玉",18);//输出:“曹玉”  
    stu.say();  
    var tea=new teacher("秦杰",16);//输出:“秦杰”  
    tea.say();  
</script>  
</body>  
</html></SPAN> 

二、call和apply的用法(详细介绍)

js中call和apply都可以实现继承,唯一的一点参数不同,func.call(func1,var1,var2,var3)对应的apply写法为:func.apply(func1,[var1,var2,var3])。

JS手册中对call的解释:

<SPAN style="FONT-SIZE: 18px">call 方法  
调用一个对象的一个方法,以另一个对象替换当前对象。      call([thisObj[,arg1[, arg2[,   [,.argN]]]]])  
参数  
thisObj  
可选项。将被用作当前对象的对象。  
arg1, arg2,  , argN  
可选项。将被传递方法参数序列。  
说明  
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。  
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。</SPAN> 

说简单一点,这两函数的作用其实就是更改对象的内部指针,即改变对象的this指向的内容。这在面向对象的js编程过程中有时是很有用的。下面以apply为例,说说这两个函数在 js中的重要作用。如:
<SPAN style="FONT-SIZE: 18px"> function Person(name,age){   //定义一个类   
        this.name=name;     //名字   
        this.age=age;       //年龄   
        this.sayhello=function(){alert(this.name)};  
    }  
    function Print(){            //显示类的属性   
        this.funcName="Print";  
        this.show=function(){  
            var msg=[];  
            for(var key in this){  
                if(typeof(this[key])!="function"){  
                    msg.push([key,":",this[key]].join(""));  
                }  
            }  
            alert(msg.join(" "));  
        };  
    }  
    function Student(name,age,grade,school){    //学生类   
        Person.apply(this,arguments);//比call优越的地方   
        Print.apply(this,arguments);  
        this.grade=grade;                //年级   
        this.school=school;                 //学校   
    }  
    var p1=new Person("卜开化",80);  
    p1.sayhello();  
    var s1=new Student("白云飞",40,9,"岳麓书院");  
    s1.show();  
    s1.sayhello();  
    alert(s1.funcName);</SPAN> 

另外,Function.apply()在提升程序性能方面有着突出的作用:
我们先从Math.max()函数说起,Math.max后面可以接任意个参数,最后返回所有参数中的最大值。
比如
<SPAN style="FONT-SIZE: 18px">alert(Math.max(5,8));   //8   
    alert(Math.max(5,7,9,3,1,6));   //9       //但是在很多情况下,我们需要找出数组中最大的元素。   
    var arr=[5,7,9,1];  
    //alert(Math.max(arr));    // 这样却是不行的。NaN   
    //要这样写   
    function getMax(arr){  
        var arrLen=arr.length;  
        for(var i=0,ret=arr[0];i<arrLen;i++){  
            ret=Math.max(ret,arr[i]);  
        }  
        return ret;  
    }  
    alert(getMax(arr)); //9   
    //换用apply,可以这样写   
    function getMax2(arr){  
        return Math.max.apply(null,arr);  
    }  
    alert(getMax2(arr)); //9   
    //两段代码达到了同样的目的,但是getMax2却优雅,高效,简洁得多。   
    //再比如数组的push方法。   
    var arr1=[1,3,4];  
    var arr2=[3,4,5];  
    //如果我们要把 arr2展开,然后一个一个追加到arr1中去,最后让arr1=[1,3,4,3,4,5]   
    //arr1.push(arr2)显然是不行的。 因为这样做会得到[1,3,4,[3,4,5]]   
    //我们只能用一个循环去一个一个的push(当然也可以用arr1.concat(arr2),但是concat方法并不改变arr1本身)   
    var arrLen=arr2.length;  
    for(var i=0;i<arrLen;i++){  
        arr1.push(arr2[i]);  
    }  
    //自从有了Apply,事情就变得如此简单   
    Array.prototype.push.apply(arr1,arr2); //现在arr1就是想要的结果</SPAN> 
Javascript 相关文章推荐
js获取图片长和宽度的代码
Nov 24 Javascript
JS控件的生命周期介绍
Oct 22 Javascript
使用javascript实现页面定时跳转总结篇
Sep 21 Javascript
js通过元素class名字获取元素集合的具体实现
Jan 06 Javascript
js与运算符和或运算符的妙用
Feb 14 Javascript
javascript转换日期字符串为Date日期对象的方法
Feb 13 Javascript
JavaScript文本框脚本编写的注意事项
Jan 25 Javascript
canvas实现粒子时钟效果
Feb 06 Javascript
详解微信第三方小程序代开发
Jun 23 Javascript
Angular4学习笔记之根模块与Ng模块
Sep 09 Javascript
浅谈如何使用webpack构建多页面应用
May 30 Javascript
layui 解决富文本框form表单提交为空的问题
Oct 26 Javascript
js浮点数保留两位小数点示例代码(四舍五入)
Dec 26 #Javascript
js中Math之random,round,ceil,floor的用法总结
Dec 26 #Javascript
js浮点数精确计算(加、减、乘、除)
Dec 26 #Javascript
js整数字符串转换为金额类型数据(示例代码)
Dec 26 #Javascript
Jquery解析json数据详解
Dec 26 #Javascript
Jquery getJSON方法详细分析
Dec 26 #Javascript
JQuery判断HTML元素是否存在的两种解决方法
Dec 26 #Javascript
You might like
PHP的一个基础知识 表单提交
2011/07/04 PHP
简单的方法让你的后台登录更加安全(php中加session验证)
2012/08/22 PHP
php中导出数据到excel时数字变为科学计数的解决方法
2013/02/03 PHP
phpmyadmin config.inc.php配置示例
2013/08/27 PHP
浅谈javascript中的instanceof和typeof
2015/02/27 Javascript
JavaScript学习笔记(三):JavaScript也有入口Main函数
2015/09/12 Javascript
简单理解vue中el、template、replace元素
2016/10/27 Javascript
DWR3 访问WEB元素的两种方法实例详解
2017/01/03 Javascript
基于rem的移动端响应式适配方案(详解)
2017/07/07 Javascript
JS+Canvas绘制动态时钟效果
2017/11/10 Javascript
vue-cli3.0配置及使用注意事项详解
2018/09/05 Javascript
微信小程序实现搜索指定景点周边美食、酒店
2019/05/18 Javascript
微信接入之获取用户头像的方法步骤
2019/09/23 Javascript
JS实现表单中点击小眼睛显示隐藏密码框中的密码
2020/04/13 Javascript
基于jsbarcode 生成条形码并将生成的条码保存至本地+源码
2020/04/27 Javascript
[02:05]2014DOTA2西雅图国际邀请赛 BBC第二天小组赛总结
2014/07/11 DOTA
python 字典(dict)遍历的四种方法性能测试报告
2014/06/25 Python
python使用arp欺骗伪造网关的方法
2015/04/24 Python
详解Python中的Descriptor描述符类
2016/06/14 Python
深入浅析Python传值与传址
2018/07/10 Python
python使用for循环计算0-100的整数的和方法
2019/02/01 Python
Python 限制线程的最大数量的方法(Semaphore)
2019/02/22 Python
python时间序列按频率生成日期的方法
2019/05/14 Python
华为校园招聘上机笔试题 扑克牌大小(python)
2020/04/22 Python
使用keras内置的模型进行图片预测实例
2020/06/17 Python
Python实现树莓派摄像头持续录像并传送到主机的步骤
2020/11/30 Python
Python爬虫入门教程01之爬取豆瓣Top电影
2021/01/24 Python
详解HTML5新增标签
2017/11/27 HTML / CSS
HTML5 canvas基本绘图之填充样式实现
2016/06/27 HTML / CSS
土耳其时尚购物网站:Morhipo
2017/09/04 全球购物
GAP阿联酋官网:GAP UAE
2017/11/30 全球购物
美国波西米亚风格服装品牌:Show Me Your Mumu
2018/01/05 全球购物
德国综合购物网站:OTTO
2018/11/13 全球购物
建筑横幅标语
2014/10/09 职场文书
2014年图书馆个人工作总结
2014/12/18 职场文书
2015年建党94周年演讲稿
2015/03/19 职场文书