javascript笔记 面向对象

时间:2023-03-08 22:00:41

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。
采用原型链继承法会导致‘父类’和‘子类’的构造模式不同,父类是混合构造模式,而子类是原型构造模式,所以不推荐这种继承。