当前位置: 首页 > news >正文

javaScript中的this指针

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

 this指针是面向对象程序设计中的一项重要概念,它表示当前运行的对象。在实现对象的方法时,可以使用this指针来获得该对象自身的引用。

  和其他面向对象的语言不同,JavaScript中的this指针是一个动态的变量,一个方法内的this指针并不是始终指向定义该方法的对象的,在上一节讲函数的apply和call方法时已经有过这样的例子。为了方便理解,再来看下面的例子:

以下是引用片段:
<script language="JavaScript" type="text/javascript">  
<!--  
//创建两个空对象  
var obj1=new Object();  
var obj2=new Object();  
//给两个对象都添加属性p,并分别等于1和2  
obj1.p=1;  
obj2.p=2;  
//给obj1添加方法,用于显示p的值  
obj1.getP=function(){  
  alert(this.p); //表面上this指针指向的是obj1  
}  
//调用obj1的getP方法  
obj1.getP();  
//使obj2的getP方法等于obj1的getP方法  
obj2.getP=obj1.getP;  
//调用obj2的getP方法  
obj2.getP();  
//-->  
</script>   

  从代码的执行结果看,分别弹出对话框显示1和2。由此可见,getP函数仅定义了一次,在不同的场合运行,显示了不同的运行结果,这是有this指针的变化所决定的。在obj1的getP方法中,this就指向了obj1对象,而在obj2的getP方法中,this就指向了obj2对象,并通过this指针引用到了两个对象都具有的属性p。

  由此可见,JavaScript中的this指针是一个动态变化的变量,它表明了当前运行该函数的对象。由this指针的性质,也可以更好的理解JavaScript中对象的本质:一个对象就是由一个或多个属性(方法)组成的集合。每个集合元素不是仅能属于一个集合,而是可以动态的属于多个集合。这样,一个方法(集合元素)由谁调用,this指针就指向谁。实际上,前面介绍的apply方法和call方法都是通过强制改变this指针的值来实现的,使this指针指向参数所指定的对象,从而达到将一个对象的方法作为另一个对象的方法运行。

  每个对象集合的元素(即属性或方法)也是一个独立的部分,全局函数和作为一个对象方法定义的函数之间没有任何区别,因为可以把全局函数和变量看作为window对象的方法和属性。也可以使用new操作符来操作一个对象的方法来返回一个对象,这样一个对象的方法也就可以定义为类的形式,其中的this指针则会指向新创建的对象。在后面可以看到,这时对象名可以起到一个命名空间的作用,这是使用JavaScript进行面向对象程序设计的一个技巧。例如:

以下是引用片段:
var namespace1=new Object();  
namespace1.class1=function(){  
  //初始化对象的代码  
}  
var obj1=new namespace1.class1();   


  这里就可以把namespace1看成一个命名空间。

  由于对象属性(方法)的动态变化特性,一个对象的两个属性(方法)之间的互相引用,必须要通过this指针,而其他语言中,this关键字是可以省略的。如上面的例子中:

以下是引用片段:
obj1.getP=function(){  
  alert(this.p); //表面上this指针指向的是obj1

转载于:https://my.oschina.net/u/1865857/blog/300892

相关文章:

  • Oracle的常见错误及解决办法
  • Cocos2d-x3.0模版容器详解之三:cocos2d::Value
  • dsoframer.ocx 实现在线的word编辑
  • 百度地图3.1.0(二)基于MapFragment的基本地图
  • XAMPP PHPSTORM XDEBUG 配合使用
  • java中有关线程的题目
  • linux中的僵尸进程
  • 图练习-BFS-从起点到目标点的最短步数(sdut 2830)邻接边表
  • Skill Level 4 D23
  • 《程序员的数学》读后感
  • 2014年8月21日   第一天学习linux linux的下载地址
  • android api doc 一
  • Oracle中的copy from导数
  • Hadoop:Task process exit with nonzero status of 1 异常
  • HTML的认识
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • 【前端学习】-粗谈选择器
  • 08.Android之View事件问题
  • CSS实用技巧干货
  • dva中组件的懒加载
  • gcc介绍及安装
  • JavaScript异步流程控制的前世今生
  • October CMS - 快速入门 9 Images And Galleries
  • php ci框架整合银盛支付
  • Puppeteer:浏览器控制器
  • python 学习笔记 - Queue Pipes,进程间通讯
  • python学习笔记-类对象的信息
  • Service Worker
  • 翻译:Hystrix - How To Use
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 如何合理的规划jvm性能调优
  • 正则表达式
  • 大数据全解:定义、价值及挑战
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (06)Hive——正则表达式
  • (javascript)再说document.body.scrollTop的使用问题
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (离散数学)逻辑连接词
  • (一)Thymeleaf用法——Thymeleaf简介
  • (转)程序员疫苗:代码注入
  • (转)大型网站的系统架构
  • (轉貼) UML中文FAQ (OO) (UML)
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .net专家(张羿专栏)
  • @RequestBody与@ResponseBody的使用
  • [ 数据结构 - C++]红黑树RBTree
  • [100天算法】-二叉树剪枝(day 48)
  • [30期] 我的学习方法
  • [AX]AX2012 R2 出差申请和支出报告
  • [C++] 如何使用Visual Studio 2022 + QT6创建桌面应用
  • [CentOs7]iptables防火墙安装与设置