1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > JavaScript中this指向问题

JavaScript中this指向问题

时间:2023-08-07 07:13:10

相关推荐

JavaScript中this指向问题

函数中的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();// 小张在玩

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。