跳过正文
  1. 博客/
  2. 随笔/
  3. 编程/

js的this引发的思考

·2 分钟· ·
随笔 编程
目录

最近这几天在开发一个hmtl5的游戏, 但是对于js怎么使用面对对象来编程有点困惑,查了一些资料
整理如下.

js的this用法
#

  • 非对象属性函数(内部函数)

      var point = {   
       x : 0,   
       y : 0,   
      moveTo : function(x, y) {   
          // 内部函数  
          var moveX = function(x) {   
      this.x = x;//this 绑定到了哪里?  
          };   
            // 内部函数  
          var moveY = function(y) {   
              this.y = y;//this 绑定到了哪里?  
           };   
    
           moveX(x);   
         moveY(y);   
       }   
      };   
      point.moveTo(1, 1);   
       point.x; //==>0   
       point.y; //==>0   
       x; //==>1   
      y; //==>1  
    
  • 对象属性函数

          var point = {   
                  x : 0,   
                  y : 0,   
                  moveTo : function(x, y) {   
                          this.x = this.x + x;   
                          this.y = this.y + y;   
      								 }   
      			};  
    
      	point.x; // ==> 1  
      	point.y; // == >1   
    
      	point.moveTo(1, 1)//this 绑定到当前对象,即 point 对象  
      	point.x; // ==> 1  
      	point.y; // == >1   
    

其实this的用法还有很多,我为什么只列出上面两种是因为所有的this用法都可以归为这两类.

非对象属性就是这个函数不存在对象的内存空间里面的函数
对象属性就是说这个函数存在于对象内存空间的函数

这样说很绕, 抽象的来说, 把每个函数都看做是对象, 我们把这个对象point想象成一个上锁的柜子A, 每个变量名就是一把钥匙, 我们这个柜子A里面可用放很多钥匙,每个钥匙又对应着其他柜子,我们也可以放东西,但是这些东西只能是一些数字字符串什么的,这就对应着对象的这种继承性,

现在我们来看放在柜子A里面的钥匙,有一个钥匙可用开其他某一个的柜子B(相当于对象的属性的moveTo函数),当我们就在柜子B里面使用this时,这个this是什么呢.

这个this就要找一个柜子, 那为什么要找一个柜子(对象呢)

这就是js语言设计的松散, 当在非严格模式下, this 会被强制转换成一个对象, 对于例子一,因为内部函数 this 并没有给他赋值(你可以把他看做一个我们找不到他的钥匙的柜子), 所以this被强制转换成了全局的柜子(全局变量)

ps: 严格模式在函数或变量前加上 'use strict';
#

怎么解决这个问题了, 有两种方法, 不是没有赋值给this嘛, 我们可用call来给函数内部的this赋值,

	  	moveX.call(this, x);   // 我们把当前函数的this赋给内部函数  

但是这种方法不够优美, 我们还可以直接把 this用个变量that给内部函数用,

					var that = this;  
					var moveY = function(y) {   
           				 that.y = y;//this   
        			 };   

这样这个this 就不会被强制转换成全局变量了, 当然你可以开启严格模式, 这样this的话就会变成undefined, 你也不会因为你的代码问题而污染全部变量.

总结
#

js 的 this 是面对对象编程的一种体现, 但是js的this由于有点不严格,所以有时候会出现一些令人意向不到的结果,

引用

相关文章

泛型继承的理解
·1 分钟
随笔 编程
泛型对于解决面对对象编程的算法设计可以提高其运算速度,但是对于引用类型来说还是没什么差别,因为引用类型只是指针的地址的调用,简单来说泛型还是挺好理解的,但是对于泛型、非泛型、继承和接口的融合就有些迷惑了。 # 比如说这种接口 # public interface IEnumeratot<T>:IDisposable,IEnumerator,ICompare<T> 这个泛型接口继承了两个非泛型接口,和一个泛型接口。 # 我一开始理解泛型就是一个个模型,只要我们把类型一个参数赋给他,他就能生成一个标准的类型,他缺少的只是一个参数而已,我们引用的时候感觉就像我们引用一个“全体方法”,把参数赋给类型后就可以一直调用类中的方法了,但是对于接口的继承如何理解? # 对于泛型类的继承,继承的类必须实现泛型的参数或者保留泛型的参数,比如下面
关于技术栈的总结
·3 分钟
随笔 人生
这段时间重新学习了web前端的技术栈,其实一开始加入社团时就是从前端开始入门的,等到了会仿写几个页面后就跳到了后端的坑,从html、css、js(只学了一点)又马不停蹄的转到.net平台、后来在老司机的带领下我们放弃了不开放的.net平台投入了python的怀抱
《我编程,我快乐:程序员职业规划之道读后感
·3 分钟
随笔 人生
一眨眼,四年过去了,再过几年就到了三十而立的年龄了,年轻的时候走马观花, 好像一直为了学习而学习,为了规划而规划,在经过被社会的毒打之后, 自己眼睛里面好像也没有当年的光了
八月杂感
·1 分钟
随笔 人生
一眨眼暑假就要过完了,这段博客又停下来了,倒不是因为我停下来学东西,而是我又忘了去归纳总结自己学的东西,总是一个鲁莽的心态去学,总感觉停下来会阻挡自己学习的脚步,但是其实写博客也是学习,把自己的学到的知识转换成自己的东西,写出来的过程就是帮自己的过程,其实这个方法也是一个非常牛逼的学习的方法叫做费尔曼学习法
<<机器学习实战>>心得.
·2 分钟
AI 心得
先谈谈我对机器学习的理解 # 什么是机器学习? # 我们人类有从婴儿开始就开始学习,父母教我们穿衣吃饭、老师教我们读书写字,我们开始能辨别好人坏人,开始通过自己的经验来判断新事物。
GitHub Education Pack
·3 分钟
后端 软件
GitHub推出一个对学生和教师的福利包,对于学生来说这是一个不小 的福利,只要通过一个edu邮箱就可以领取,但奈何国内有些无良人买卖 邮箱,所以GitHub对于.cn的邮箱一律拒绝,但是可以通过上传学生证的方法 得到验证,题主刚开始用学校邮箱试了试,失败了,抱着试一试的心态,上传了 学生证,没想到第二天就给我回复,并给我这个豪华大礼包,接下来我就介绍介绍 如何用这个包来.