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

原文地址:https://www.cnblogs.com/JhoneLee/p/3333508.html