WEB前端技术核心:JaveScript学习之旅(原型小知识点剖析5)

      我们已经了解了原型中继承的概念,现在说一下常用的call()和apply()。

      每个函数都涵盖了两个非继承而来的方法:call和apply。它们的作用是相同的,都是在某一个函数当前执行上下文中调用函数。等于设置函数体内this对象的值,以扩充函数运行的作用域。简单来说,this总是指向某个方法的对象,而使用call()和apply()方法时候,就会改变this的指向,所以,我们可以把call和apply看做是某个对象的方法,通过调用的方法的形式,简接调用函数。

      call()方法使用举例:

    function ShaoLin(quanfa,gunfa,tuifa){

          this.quanfa = quanfa;

          this.gunfa = gunfa;

          this.tuifa = tuifa;

      function WuDang(jianfa,daofa){

            this.jianfa = jianfa;

            this.daofa = daofa;

      function EMei(neigong){

              this.neigong = neigong;

    function ZhangSanFeng(){

};

var zhangsanfeng = new ZhangSanFeng();

上述代码我们简单梳理一下,前三个构造函数分别都是有形参的,在这里用了武林门派当作函数名,形参用武功来表示,最后一个构造函数相当于一个人,这个人要去访遍武学门派并习得镇派武功,然后汇集于一身。我们可以通过call,在ZhangSanFeng这个构造函数里间接的调用上面其他函数的对象属性。写法如下。

function ZhangSanFeng(quanfa,gunfa,tuifa,jianfa,daofa,neigong){

      ShaoLin.call(this,quanfa,gunfa,tuifa);

      WuDang.call(this,jianfa,daofa);

      EMei.call(this,neigong);

注意看首先在这个构造函数里,写了形参,都是之前的构造函数里的参数,全部写进去了。然后第二点,call的用法,用黑体标记了。函数名后面紧跟call()。且都有this,后面才跟着这个函数的形参。这个this代表着当前调用的函数母对象。写到这一步,可以传实参进去测试:

var zhangsanfeng = new ZhangSanFeng(“罗汉拳”,“达摩棍”,“金刚腿”,“太极剑”,“八卦刀”,“九阳神功”)

这时候到控制台可以输入zhangsanfeng看看现在这些参数都会传进来了。仔细看看,ZhangSanFeng这个函数可是一行属性都没写,全部都是用的别的函数的成果。就好比,他本身一点武功没有,去这个门派拿了内功心法,去那个门派拿了刀剑心得。这种做法在工作中也会用到。如果你写的东西,刚好有别人写过了,你写的又全涵盖他写的,可以直接调用。好比别人写的是零部件,你拿过来组装。合成一个整体。

      说完了call(),再说说apply(),他们俩作用是一样的,其实用法都差不多,不同点是apply()里面只能传一个数组形式的参数。

      call需要把实参按照形参个数传进去

      apply需要传一个arguments

结合上述例子,用法也很直观:

    函数名.call(this,形参1,形参2,形参3)

  函数名.apply(this,【形参1,形参2,形参3】)


      再补一个知识点,前面提到过prototype(显示原型),一个函数被创建之后都会拥有一个名为prototype的属性,这个属性指向当前函数作为构造函数构造出来的对象的原型对象。划重点:__ptoto__是每个对象都有的一个属性,且为隐式原型。

这两个属性的是有区别的:

__proto__是每个对象都有的属性(包括构造函数),而prototype是函数才会有的属性。

__proto__是指向当前对象的原型对象,而prototype是指向它的构造函数的原型对象。

两个属性的作用:

都是为了继承;

prototype是用来实现基于原型的继承和属性的共享;

__proto__(这种下划线写法是规定的)构成了原型链,同样用于实现基于原型的继承,举个例子,当我们访问一个对象的某属性时候,如果在该对象中找不到,就会沿着__proto__依次查找;

图片发自App

可以看到图片左上方两个对象f1和f2的属性__proto__指向了构造函数Foo()的prototype原型对象。

构造函数Foo()原型属性prototype指向了它的构造函数原型对象。

Object.prototype的__proto__属性指向null。




你可能感兴趣的:(WEB前端技术核心:JaveScript学习之旅(原型小知识点剖析5))