函数中的this指向:
DOM(文档对象模型的顶级对象是:document)
BOM(浏览器对象模型的顶级对象是:window)
- 普通函数中的this指向-------window
- 对象.方法中的this指向-------当前的实例对象
- 定时器方法中的this指向------window
- 构造函数中的this指向-----实例对象
- 原型对象方法中的this指向----实例对象
apply()和call()改变this的指向:
/*
* apply()的使用语法
* 函数名字.apply(对象, [参数1, 参数2, 参数3......])
* 方法名字.apply(对象, [参数1, 参数2, 参数3......])
* call()的使用语法
* 函数名字.call(对象, 参数1, 参数1, 参数1)
* 方法名字.call(对象, 参数1, 参数1, 参数1)
*
* 作用:改变this的指向
* 不同的地方:参数传递的方式是不一样的
*
* 只要是想使用别的对象的方法,并且希望这个方法是当前对象的,那么就可以使用 apply() 或者是 call() 来改变 this 的指向。
* */
// 演示代码1
function Person(name, age){
this.age;
this.fun1 = function (a, b) {
console.log("这是人的方法:a+b="+ (a+b) + "; " + this.score);
}
}
function Student(score) {
this.score = score;
}
var per = new Person("张三", 25);
var stu = new Student(100);
// 未改变 this 指向前
per.fun1.apply(null, [10,20]); // 这是人的方法:a+b=30; undefined
per.fun1.call(null, 10, 20); // 这是人的方法:a+b=30;undefined
// 改变 this 指向
per.fun1.apply(stu, [10, 20]); // 这是人的方法:a+b=30; 100
per.fun1.call(stu, 10, 20); // 这是人的方法:a+b=30; 100
/*
* 从上可以看出,score 是 Student 的属性,fun1 是 Person 的方法,通过传入对象
* stu,修改了 fun1 中 this 的指向为 stu,从而获得了 stu 属性值 score。
* */
// apply()和call()方法来自哪里?
console.log(per.fun1.__proto__ == Function.prototype); // 表明所有函数对象都是Function的实例对象
console.log(Function.prototype); // { [nativecode] }
// apply() 和 call() 方法实际上并不在函数这个实例对象中,而是在Function的prototype中
bind()复制函数
f/*bind是用来复制一份
* 使用的语法:
* 函数名字.bind(对象, 参数1, 参数2, 参数3); ----->返回值是复制之后的这个函数
* 方法名字.bind(对象, 参数1, 参数2, 参数3); ----->返回值是复制之后的这个函数
* */
function Person(name, age){
this.name = name;
this.age = age;
Person.prototype.play = function () {
console.log(this.name + "在玩");
}
}
function Student(name, age, score){
this.name = name;
this.age = age;
this.score =score;
}
var per = new Person("小明", 15);
var stu = new Student("小张", 16, 200);
// 复制 per 的 play() 方法给ff,并修改 this 指向(由 per 指向 stu)
var ff = per.play.bind(stu);
ff(); // 小张在玩