JavaScript——对this指针的理解

编程入门 行业动态 更新时间:2024-10-21 11:55:29

JavaScript——对this<a href=https://www.elefans.com/category/jswz/34/1768268.html style=指针的理解"/>

JavaScript——对this指针的理解

在我们声明一个函数时,每个函数除了有定义时的parameters(形参),自身还会有额外的两个参数,一个是this,一个是arguments(实参)。arguments就是函数实际接受到的参数,是一个类数组。arguments我只做个简略的介绍,重点我们放在this指针上。

在面向对象变成中,this十分重要,它的值取决于调用的模式。而在JavaScript中,一共有4中调用模式:方法调用模式、函数调用模式、构造函数调用模式、apply调用模式。

  • 方法调用模式

  当一个函数是作为一个对象的属性时,我们通常称这个函数是这个对象的一个方法。当这个方法被调用时,this就会指向该方法所属对象。

<script type="text/javascript">var people = {name : "Yika",sayName : function(){console.log(this.name);   //"Yika"//this已经绑定在了people对象上了}}people.sayName();
</script>

如栗子所示,this指向了sayName对象,这种通过this取得所属对象上下文的方法,就是公共方法。(publice method)

  • 函数调用模式

  当一个函数被调用时并非某个对象上的方法,那么它就是作为一个函数被调用的。

这种模式调用,this会指向window对象,即使这个函数或许是在外部函数里调用的,我们来看栗子。

 1 <script type="text/javascript">2     var name = "window-Yika";3     var people = {4         name : "people-Yika",5         student : function(){6             console.log(this);   //这里的this绑定的是对象people7             function sayName(){8                 var name = "sayName-Yika";9                 console.log(this.name); //window-Yika
10           //即使sayName函数本身和它所在的people对象都有name值,但是this是指向window的
11             };
12             sayName();
13         }
14     }
15 
16     people.student();
17 </script>    

 

  这样一看,是不是大概知道该怎么解决JavaScript这个“设计错误"了呢。

是的只要在student函数里面,也就是第6行,将this缓存起来。然后再将this通过变量转移到sayName函数里就可以解决啦!

var people = {name : "people-Yika",student : function(){var self = this; //将this缓存起来function sayName(){var name = "sayName-Yika";  console.log(self.name);  //"people-Yika",此时的self指向的是people对象};sayName();}}
  • 构造函数调用模式

  JavaScript里一讲到构造函数,脑海里就会有:“函数名大写!调用的时候要用new操作符!” 函数名大写好理解,是为了规范统一构造函数的命名。可是你有没有深究过为什么要用new呢?如果在一个函数前面带上new来调用,那么函数后台会创建一个指向该函数prototype的新对象,同时this也绑定在新对象上。JavaScript是一门基于原型继承的语言,对原型prototype不是很清楚的同学可以自己去查一下资料,我重点放在this上面。

我们先来看看构造函数一般长什么样子。

<script type="text/javascript">function People(name){this.name = name;    //这里的this,用new调用后便指向了新对象Yika    
     this.sayName = function(){console.log(this.name); //输出}}
  var Yika = new People("Yika");
Yika.sayName(); //输出“Yika" ,因为Yika是通过new调用得来的,this都绑定在了Yika对象上。 </script>

乍一看,好像不是好懂,怎么刚才在函数里的this是指向window,现在不用缓存就可以指向People函数呢?

没关系,刚才不是说函数通过new调用,会在背地里自己做“做坏事”么,我们一起看看到底做了哪些事。

<script type="text/javascript">function People(name){var that = {};   //坏事一:自己生成一个对象that.name = name;that.sayName = function(){console.log(that.name);};return that;    //坏事二,自己会改变return的行为,return刚生成的对象}var Yika = People("Yika"); //这里可以省略new,模仿调用new操作符Yika.sayName(); //和刚才一样输出"Yika"
</script>

 

这样看就明白清楚了吧,new不仅会生成一个对象,而且还会自动return这个对象,这样自然this便指向了这个新对象。

千万记得要用 new 去调用构造函数,不然出了问题,是没有警告的,所有大写约定还是十分有必要的。

  • Apply调用模式

apply方法让我们构建一个参数数组传递给调用函数,也允许我们改变this值。

function.apply(this绑定的值, arguments参数数组)

apply可以说的东西太多了,我这里只举个的栗子来帮助大家理解:

<script type="text/javascript">function People(name){this.name = name;this.sayName = function(){console.log(this.name);   //sayName这个方法是属于People构造函数的}}function Student(name){People.apply(this, arguments);//借用构造函数的集成方式,就是在Student构造函数里,通过apply调用People构造函数,并改变People的this值//这样每次创建Student实例时,都会调用People构造函数}var student = new Student("Yika");student.sayName(); //输出“Yika”
</script>

我们可以通过apply轻易的修改函数的this绑定对象,和apply相似的方法call也有一样的效果。

转载于:.html

更多推荐

JavaScript——对this指针的理解

本文发布于:2024-02-11 11:53:32,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1680847.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:指针   JavaScript

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!