this上下文,以及通过call apply 实现继承

Posted zhoudingzhao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了this上下文,以及通过call apply 实现继承相关的知识,希望对你有一定的参考价值。

上下文:this关键字通常指向当前函数的拥有者,把拥有者叫做执行上下文。

this代表函数运行时自动生成的内部对象,只能在函数内部使用。

构造函数中的this 指 构造函数的实例对象。javascript存在定义时上下文和运行时上下文。

函数的 call 和 apply 方法 可以改变上下文执行对象。可以在自定义上下文中执行函数,call 函数需要参数列表,apply 需要一个数组参数。
调用对象的一个方法,以另一个对象替换当前对象,更改对象this指向的内容。以某个方法当做指定的某个对象的方法被执行。

var pet = {
        words:‘…………‘,
        speak:function(say){
                console.log(say + ‘ ‘ + this.words)
        }
}

pet.speak(‘Speak‘);

var dog = {
        words:"Wang",
}

pet.speak.call(dog,‘Speak‘)               // 输出: Speak Wang

  

pet.speak.call(dog,‘Speak‘)
调用的方法是: pet.speak ,理论上说 this 指向pet对象, 但是通过call 改变了执行上下文,把 this指针 指向了 dog 。使 dog对象 有了pet的speak方法 。第二个 ‘Speak’ 是前面的方法 pet.speak 的参数。

通过call或者apply 赋给第一个对象参数 dog 一种能力,即该对象可以调用 前面的方法 的能力。
通过call或者apply 方式,所指定的对象 dog ,这个对象是调用某个方法时,用这个对象作为该方法的上下文。

上面的方法是函数使用的时候才改变 this 对象,以下的程序是在函数定义的时候改变this上下文。

利用call 或者apply 改变 this  上下文的特性 可以实现继承。

function Pet(name,words){
        this.name = name;
     this.words = words; this.speak = function(){ console.log(this.name + " say: " + this.words); } }
var pet = new Pet(‘Cat‘,‘MIAO‘);
pet.speak(); //输出: Cat say: MIAO
function Dog(words){
        Pet.call(this, words);        //把Pet 里面的this 指向当前的 this对象,即 Dog 对象,使 Dog 拥有Pet 的方法。
        //Pet.apply(this,arguments)
}

var dog = new Dog(‘Wang‘);            // call 实现了继承。具有 Pet 的方法。

dog.speak()                           // 输出: Wang say: undefined

  

以上是关于this上下文,以及通过call apply 实现继承的主要内容,如果未能解决你的问题,请参考以下文章

apply,call,bind

apply和call的适用范围

js call()apply()bind()的区别和使用

关于call和apply的使用和区别

原生实现JavaScript的call()apply()bind()

理解和运用javascript中的call及apply