原型 作用域和作用域链 函数四种调用模式 this的指向 call apply bind

133 阅读2分钟

原型

  • 内个构造函数都会有一个默认关联对象,这个对象就是构造函数的原型

  • 这个构造函数的实例,都可以访问这个构造函数原型中的成员

  • 相关属性

    • 构造函数.prototype:获取构造函数的原型
    • obj._ proto_ 可以获取原型
    • 原型constructor可以获取构造函数
  • 应用:全局使用,为某一类对象添加公共的成员

  • 注意细节:对象所有访问的原型是创建这个对象时构造函数所指向的原型,建议后期操作原型使用点语法

  • 原型链:原型时一个对象,对象又有原型,组成原型链

    • 属性查找规则:自己没有,就找原型,一直找到Object,如果没有就会报错

作用域和作用域链

  • let的作用域时创建let变量开始到他所在的结构的}结束
  • 函数内部可以访问函数外部的成员,当查找一个属性的时候,先找自身的作用域,如果没有查找上一级作用域,一直到顶级作用域,如果还没有就报错

函数四种调用模式

  1. 函数的调用
  2. 方法调用
  3. 构造函数调用
  4. 上下文调用 call

this的指向

函数调用---this指向window

方法调用---this指向调用方法对象

构造函数调用---this指向创建的对象

上下文调用---this传入的对象

方法借用模式

上下文模式,分为apply与call,bind

call

call方法可以调用一个函数,并且可以指定这个函数的this指向

const RichWumon = {
    name: "富婆",
    say: function () {
        console.log(this.name, " 我要重金求子");
    }
}
​
const obj = {
    name: "屌丝"
}
​
RichWumon.say();            // 富婆
RichWumon.say.call(obj);    // 屌丝

call的应用

将伪数组转成数组

 let divs = document.querySelectorAll('div'); // 伪数组
        // let divs = document.body.children;
        console.log(divs);
​
        function change(nodelist) {
            return Array.prototype.slice.call(nodelist);
​
        }
        console.log(change(divs));

apply

apply()方法接受的是一个包含多个参数的数组。而call()方法接受的是若干个参数的列表

例:简化log方法

// 简化log方法
function log() {
    // 不需要改变this
    console.log.apply(console, arguments);
}

bind方法

bind() 方法创建一个新的函数, 可以绑定新的函数的this指向