猿问

javascript关于this的一个问题

functionPerson(){
this.say=function(){
console.log("Hello");
};
}
varperson=newPerson();
person.say();
这应该是一个奇怪的问题,为什么可以通过person.say的方式访问say方法。好像把this去掉,就不能正常输出结果了。这个this有什么作用。
我在判断this指代谁的时候总会告诉自己谁调用指代谁,而这次,this直接出现在了say前面,我有点糊涂了,感觉自己没办法表达清楚自己的问题。
慕虎7371278
浏览 347回答 2
2回答

交互式爱情

先来看一段ES6class语法的例子classPerson{say(){console.log("hello");}}constperson=newPerson();person.say();上面这是采用class语法定义的Person类,它有一个say()方法。运行效果和题主的代码运行效果一致,但本质上还是有些区别。这段代码里看不到this,而say()方法也不是定义在Person的每个实例对象上,而是定义在Person的原型对象中。如果要把题主的代码翻译成class语法,应该是这样:classPerson{constructor(){this.say=function(){console.log("hello");};}}constperson=newPerson();person.say();这里出现了constructor,即构造函数。构造函数中,通过this指针对实例对象添加了一个say()方法。如果有多个实现,每个实例都有自己的say()方法实例,虽然行为一样,但却是不同的对象,可以验证一下classPerson{constructor(){this.say=function(){console.log("hello");};}}constperson=newPerson();constp2=newPerson();console.log(person.say===p2.say);//false这里提到了构造函数。在ES6以前,需要定义JavaScript类,就是通过构造函数来定义的,然而实际上,构造函数和普通函数在定义上并没有多大区别,当调用的时候使用了new运算符,就是构造,没使用,就是普通函数参阅:JavaScript的this指向问题深度解析。OOP语言在产生对象的时候一般都是这么一个过程:产生一个对象,从最远的基类开始依次调用变量初始化(如果有的话)和构造函数,所以调用构造函数的时候,已经存在对象,this指针已经生效,可以在构造函数中使用this指针。对于静态语言来说,可以通过this指针访问已经定义的属性,或者方法。而JavaScript是动态语言,所以甚至可以使用this指针赋予它新的属性,比如this.say=....,当这个属性是一个函数表达式的时候,就相当于是在定义新的实例方法(非常确切的实例方法,每个实例一个,各自不同)。最后,既然是方法,那就可以使用对象.方法()的形式来调用,也就是person.say()。如果没有定义,当然也就不能调用了,也就是题主说的没效果(实际应该报错)
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答