这里有新鲜出炉的 Javascript 教程,程序狗速度看过来!
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
这篇文章主要介绍了 javascript 基于原型链的继承及 call 和 apply 函数用法, 结合实例形式较为详细的分析了 javascript 中继承的概念、创建方法以及 call 和 apply 函数的功能与使用技巧, 需要的朋友可以参考下
本文实例讲述了 javascript 基于原型链的继承及 call 和 apply 函数用法。分享给大家供大家参考,具体如下:
1. 继承是面向对象编程语言的一个重要特性,比如 Java 中,通过 extend 可以实现多继承,但是 JavaScript 中的继承方式跟 JAVA 中有很大的区别,JS 中通过原型链的方式实现继承。
(1)对象的原型:因为 JS 中,函数也是对象,因此我们先从对象出发。什么是对象的原型,原型的定义为:
所有通过对象直接量创建的对象都具有同一个函数原型,并且可以通过 Object.prototype 获得对原型对象的引用,通过关键字 new 和构造函数调用创建的对象的原型就是构造函数的 prototype 属性的值。
注:没有原型的对象不多,Object.prototype 对象是没有原型的。
(2)创建对象的原型
比如这里有一个 Student 对象和一个 Person 对象,其中,Student.prototype 指向 Person.prototype
对于创建对象完全不同的两种方法:
i)Student.prototype=Person.prototype
这种方法,创建 Student 的 prototype 对象,如果改变 Student.prototype 的值的时候,Person.prototype 也会同时改变,为了避免这种情况,我们应采用其他方式;
ii)Student.prototype=Object.create(Person.prototype)
这种方法,创建的 Student 的 Prototype 对象,在改变 Student.prototype 的属性或者方法时,不会同时去改变 Person.prototype 的属性。
(3)基于继承的赋值操作
例 1:
- var o={
- x:1
- }
- o.x=2;
- alert(o.x);//输出o.x=2
例 2:
- var o={
- x:1
- }
- var osp=Object.create(o);
- alert(osp.x);//输出1
- osp.x=2;
- alert(osp.x);//输出2
i) 从上面的两个例子中,我们大概可以看出来,如果对象 osp 上有 x 属性,那么无论是取值,还是赋值,都是基于 osp 对象上的直接属性 x,如果 osp 对象上没有 x 属性,那么会沿着 prototype 原型链查找,直到找到一个包含 x 属性的 prototype 属性链上的对象,如果 osp 对象所有 prototype 原型链上都没有包含 x 属性,那么返回 underfined。
ii)o 对象属性的赋值,被视为在 osp 对象上直接进行,不会影响原型链上的属性。比如上例中的 osp.x=2 的赋值是在 osp 对象上,不会影响 osp 的原型对象 o。
2. 举一些对象中继承的例子
(1)我们学过可以用 instanceof 来进行类型判断,instanceof 方法本来就是基于原型链的。
比如例 3:
[1,2] instanceof Array // 返回 true [1,2] instanceof Object // 返回 true
这个例子说明 Array.prototype 也是继承于对象而来。
(2)函数中的组合继承问题
- function student(name,age){
- this.name=name;
- this.age=age;
- }
- student.prototype.age=function(){
- return this.age;
- }
- function beststudent(name,age){
- student.call(this,age);
- return this.name;
- }
- beststudent.prototype=new student();
- alert(beststudent("yu",2))//输出2
- }
3. call 函数和 apply 函数
call 函数和 apply 函数用于改变函数中 this 的指向,用于对象 A 调用对象 B 的方法,call 函数和 apply 函数的区别在于传参的类型不同,apply(x,y),x 表示的是执行函数的对象,而 y 则表示执行函数所需要调用的参数,是一个数组,并且可以传参为 argument 数组,而 call(x,y) 中的 y 之后的变量则是实实在在的变量;
希望本文所述对大家 JavaScript 程序设计有所帮助。
来源: http://www.phperz.com/article/17/0601/329527.html