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 localStorage实现本地缓存的方法
Jun 22 Javascript
浅析jquery的作用与优势
Dec 02 Javascript
javascript的push使用指南
Dec 05 Javascript
node.js中的fs.symlinkSync方法使用说明
Dec 15 Javascript
JavaScript暂停和继续定时器的实现方法
Jul 18 Javascript
JavaScript实现类似拉勾网的鼠标移入移出效果
Oct 27 Javascript
利用canvas实现的加载动画效果实例代码
Jul 05 Javascript
详解Vue路由History mode模式中页面无法渲染的原因及解决
Sep 28 Javascript
vue中实现methods一个方法调用另外一个方法
Feb 08 Javascript
微信小程序中使用Async-await方法异步请求变为同步请求方法
Mar 28 Javascript
微信小程序swiper使用网络图片不显示问题解决
Dec 13 Javascript
详解CocosCreator项目结构机制
Apr 14 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
Laravel5中contracts详解
2015/03/02 PHP
PHP中使用socket方式GET、POST数据实例
2015/04/02 PHP
php session的锁和并发
2016/01/22 PHP
JS 动态获取节点代码innerHTML分析 [IE,FF]
2009/11/30 Javascript
Firefox和IE兼容性问题及解决方法总结
2013/10/08 Javascript
js判断登录与否并确定跳转页面的方法
2015/01/30 Javascript
深入理解JavaScript系列(25):设计模式之单例模式详解
2015/03/03 Javascript
jQuery实现文本框输入同步的方法
2015/06/20 Javascript
jQuery判断checkbox选中状态
2016/05/12 Javascript
浅谈JS使用[ ]来访问对象属性
2016/09/21 Javascript
Bootstrap框架的学习教程详解(二)
2016/10/18 Javascript
Vue input控件通过value绑定动态属性及修饰符的方法
2017/05/03 Javascript
基于JS对象创建常用方式及原理分析
2017/06/28 Javascript
javascript实现Emrips反质数枚举的示例代码
2017/12/06 Javascript
node基于puppeteer模拟登录抓取页面的实现
2018/05/09 Javascript
vue.js 图片上传并预览及图片更换功能的实现代码
2018/08/27 Javascript
如何解决js函数防抖、节流出现的问题
2019/06/17 Javascript
vue实现多级菜单效果
2019/10/19 Javascript
Vue.js中的高级面试题及答案
2020/01/13 Javascript
[01:52]2020年DOTA2 TI10夏季活动预告片
2020/07/15 DOTA
python求列表交集的方法汇总
2014/11/10 Python
Python实现配置文件备份的方法
2015/07/30 Python
python基础教程项目二之画幅好画
2018/04/02 Python
python3 读写文件换行符的方法
2018/04/09 Python
python ddt数据驱动最简实例代码
2019/02/22 Python
python pillow模块使用方法详解
2019/08/30 Python
TensorFlow使用Graph的基本操作的实现
2020/04/22 Python
HTML5在a标签内放置块级元素示例代码
2013/08/23 HTML / CSS
植村秀美国官网:Shu Uemura美国
2019/03/19 全球购物
英国顶级足球鞋的领先零售商:Lovell Soccer
2019/08/27 全球购物
物业管理个人自我评价
2013/11/08 职场文书
预备党员2014年第四季度思想汇报范文
2014/10/25 职场文书
2015年清明节网上祭英烈活动总结
2015/03/26 职场文书
linux中nohup和后台运行进程查看及终止
2021/06/24 Python
Django模型层实现多表关系创建和多表操作
2021/07/21 Python
Python如何用re模块实现简易tokenizer
2022/05/02 Python