原型
-
内个构造函数都会有一个默认关联对象,这个对象就是构造函数的原型
-
这个构造函数的实例,都可以访问这个构造函数原型中的成员
-
相关属性
- 构造函数.prototype:获取构造函数的原型
- obj._ proto_ 可以获取原型
- 原型constructor可以获取构造函数
-
应用:全局使用,为某一类对象添加公共的成员
-
注意细节:对象所有访问的原型是创建这个对象时构造函数所指向的原型,建议后期操作原型使用点语法
-
原型链:原型时一个对象,对象又有原型,组成原型链
- 属性查找规则:自己没有,就找原型,一直找到Object,如果没有就会报错
作用域和作用域链
- let的作用域时创建let变量开始到他所在的结构的}结束
- 函数内部可以访问函数外部的成员,当查找一个属性的时候,先找自身的作用域,如果没有查找上一级作用域,一直到顶级作用域,如果还没有就报错
函数四种调用模式
- 函数的调用
- 方法调用
- 构造函数调用
- 上下文调用 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指向