• 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
    

      

  • 相关阅读:
    Docker安装Zookeeper并进行操作
    JVM 完整深入解析
    synchronized关键字加到static静态方法和非static静态方法区别
    submit与execute区别
    ThreadPoolTaskExecutor和ThreadPoolExecutor区别
    Redis占用内存大小
    Java中CycliBarriar和CountdownLatch区别
    Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
    文本格式
    JavaScript事件
  • 原文地址:https://www.cnblogs.com/z360519549/p/5553683.html
Copyright © 2020-2023  润新知