函数中的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;
}
varper= new Person("张三", 25);
varstu= 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;}varper= new Person("小明", 15);varstu= new Student("小张", 16, 200);// 复制 per 的 play() 方法给ff,并修改 this 指向(由 per 指向 stu)varff=per.play.bind(stu);ff();// 小张在玩