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 getElementsByTagName的简写方式
Jun 27 Javascript
基于jquery的web页面日期格式化插件
Nov 15 Javascript
jQuery实现可拖动的浮动层完整代码
May 27 Javascript
javascript将url中的参数加密解密代码
Nov 17 Javascript
jquery解决客户端跨域访问问题
Jan 06 Javascript
轻松实现javascript图片轮播特效
Jan 13 Javascript
Es6 写的文件import 起来解决方案详解
Dec 13 Javascript
JavaScript变量类型以及变量作用域详解
Aug 14 Javascript
JS实现图片放大镜插件详解
Nov 06 Javascript
详解node.js的http模块实例演示
Jul 12 Javascript
利用JavaScript的Map提升性能的方法详解
Aug 14 Javascript
Vue 使用Props属性实现父子组件的动态传值详解
Nov 13 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+javascript制作带提示的验证码源码分享
2014/05/28 PHP
PHP中实现获取IP和地理位置类分享
2015/02/10 PHP
微信公众号模板消息群发php代码示例
2016/12/29 PHP
php接口隔离原则实例分析
2019/11/11 PHP
表格 隔行换色升级版
2009/11/07 Javascript
JavaScript中常见陷阱小结
2010/04/27 Javascript
JavaScript拆分字符串时产生空字符的解决方案
2014/09/26 Javascript
Javascript writable特性介绍
2015/02/27 Javascript
全屏js头像上传插件源码高清版
2016/03/29 Javascript
JS获取随机数和时间转换的简单实例
2016/07/10 Javascript
JS数组返回去重后数据的方法解析
2017/01/03 Javascript
基于angular-utils-ui-breadcrumbs使用心得(分享)
2017/11/03 Javascript
js构造函数创建对象是否加new问题
2018/01/22 Javascript
JS简单获得节点元素的方法示例
2018/02/10 Javascript
如何实现双向绑定mvvm的原理实现
2019/05/28 Javascript
JavaScript实现页面中录音功能的方法
2019/06/04 Javascript
Python 匹配任意字符(包括换行符)的正则表达式写法
2009/10/29 Python
使用Python进行稳定可靠的文件操作详解
2013/12/31 Python
使用Node.js和Socket.IO扩展Django的实时处理功能
2015/04/20 Python
Python使用multiprocessing创建进程的方法
2015/06/04 Python
python 与GO中操作slice,list的方式实例代码
2017/03/20 Python
python自动化测试之异常及日志操作实例分析
2019/11/09 Python
Python Mock模块原理及使用方法详解
2020/07/07 Python
如何使用python socket模块实现简单的文件下载
2020/09/04 Python
详解Django中的FBV和CBV对比分析
2021/03/01 Python
利用三角函数在canvas上画虚线的方法
2018/01/11 HTML / CSS
html5关于外链嵌入页面通信问题(postMessage解决跨域通信)
2020/07/20 HTML / CSS
连卡佛中国官网:Lane Crawford中文站
2018/01/27 全球购物
线程同步的方法
2016/11/23 面试题
影视动画专业个人的自我评价
2013/12/31 职场文书
团日活动策划书
2014/02/01 职场文书
医疗纠纷协议书
2014/04/16 职场文书
2014年商场国庆节活动策划方案
2014/09/16 职场文书
一份没有按时交货失信于客户的检讨书
2014/09/19 职场文书
安全伴我行主题班会
2015/08/13 职场文书
“鬼灭之刃”热度不减,其成功背后的原因是什么?
2022/03/22 日漫