javascript笔记 面向对象
Javascript是一种面向对象的弱语言,既然有面向对象,就有继承
继承:
1.call函数和apply函数:区别在于它们参数上的不同,固定参数的用call,可变参数的用apply。换句话说,就是apply接收的是arguments。
2.arguments是一个特别的数组参数,如果参数为arguments,你的参数只要是数组它就能接受,所以apply可以写成apply(function(){},arguments);
3.object.call.call(object2)和object.apply.apply(object2)
如果写成这样,那么输出会是object2定义的函数输出格式,而不是object的格式,但是原理不是类似于负负得正,call.call.call(object2)的结果还是object2的格式,因为多余两个的.call没有意义,不会参与执行,apply也一样。
原理:宿主.call中的对象被执行后,宿主中的this变成了该对象,所以再执行一次.call的时候,新宿主就是上次被执行的对象。
继承的方式:
1.通过原型链继承
所谓原型链就是利用 prototype 这一特殊的指针来进行方法的由子到父的逐级寻找调用,这种继承的思维虽然能完成继承,但是如果阁下学过java C++ C#等强面向对象语言,是不好理解的。
看代码:
//定义一个父函数 function father() { this.LastName = 'Tommy'; this.FirstName='Mark'; } father.prototype.SayFirstName = function () { alert(this.FirstName); };
然后我们弄一个儿子函数来继承它
function son() { this.FirstName = 'Toney'; //this.FName='Toney'; } son.prototype = new father(); son.prototype.SayFName = function () { alert(this.FirstName); //alert(this.FName); }; son.prototype.SayFName();
我们的输出结果会是Mark,而不是Toney,即使我们把相应代码替换成注释内容仍旧不能正常显示,会输出undefined。除非我们在son.prototype上定义FName,即son.prototype.FName='Toney',才会正常显示Toney。
采用原型链继承法会导致‘父类’和‘子类’的构造模式不同,父类是混合构造模式,而子类是原型构造模式,所以不推荐这种继承。