YDNJS(上卷):this 的绑定对象
函数中的
this
是在调用时被绑定的,this
指向谁完全取决于函数的调用位置。
确定 this
的绑定对象的方式有 4 种。
默认绑定
默认绑定就是将函数中的 this
绑定给了全局对象 window
。这往往适用于我们调用函数时,不带有任何修饰的情况。
function foo() {
console.log(this.a);
}
var a = 2;
foo(); // 2
我们调用函数 foo
的方式是直接调用,所以函数执行时,函数中的 this
是指向全局对象 window
, 取 window
对象的 a
属性,就是取全局变量 a
,所以打印出的结果是 2。
隐式绑定
隐式绑定就是将函数作为对象属性调用。这时函数内部的 this
指向对象本身。
function foo() {
console.log(this.a);
}
var obj = {
a: 2,
foo: foo
};
obj.foo(); // 2
上面的代码中,我们以 obj
对象的属性形式,调用了 foo
函数,这时函数中的 this
就是对象 obj
,this.a
就是 obj.a
,自然就是 2 了。
还有,对于隐式绑定,函数的调用位置是 对象属性引用链中的最后一层。
function foo() {
console.log(this.a);
}
var obj2 = {
a: 42,
foo: foo
};
var obj1 = {
a: 2,
obj2: obj2
};
obj1.obj2.foo(); // 42
对象属性引用链中的最后一层是 obj2
,foo
是它的一个属性,所以 foo
函数执行时,内部 this
指向 obj2
对象,所以打印结果是 42。
显式绑定
显示绑定就是使用函数的 call()
或者 apply()
方法,为执行的函数显式指定上下文执行对象,也就是显式指定执行函数内部的 this
指向的对象。
函数的 call()
或者 apply()
方法接收的第一个参数是一个对象,在调用函数时会将这个对象绑定给 this
。就是说是直接给 this
指定绑定的对象,因此称为显式绑定。
function foo() {
console.log(this.a);
}
var obj = {
a: 2
};
foo.call(obj); // 2
new 绑定
在传统的面向类的语言中,「构造函数」是类中的一个特殊方法,在使用 new
初始化类实例时会被自动调用。
需要清楚得是:JavaScript 中 new
的机制与面向类的语言中的 new
完全不同。
在 JavaScript 中,根本就不存在「构造函数」,只有对函数的「构造调用」。JavaScript 中的所有函数都可以用 new
调用,这种函数调用称为对函数的「构造调用」。
使用 new
来调用函数,或者说在对函数进行「构造调用」时,会自动执行下列步骤:
- 创建一个全新的对象。
- 新对象执行
[[Prototype]]
连接。 - 被调用函数中的
this
绑定到这个新对象。 - 如果函数没有返回其他对象,则返回这个新对象。
下面是一个例子:
function foo() {
this.a = a;
}
var bar = new foo(2);
bar.a; // 2
我们使用 new
来调用 foo()
时,会创建一个全新的对象,然后 foo
函数内部的 this
就会绑定到这个新对象上。
优先级
new 绑定 > 显式绑定 > 隐式绑定 > 默认绑定
YDNJS(上卷):this 的绑定对象的更多相关文章
- 背水一战 Windows 10 (22) - 绑定: 通过 Binding 绑定对象, 通过 x:Bind 绑定对象, 通过 Binding 绑定集合, 通过 x:Bind 绑定集合
[源码下载] 背水一战 Windows 10 (22) - 绑定: 通过 Binding 绑定对象, 通过 x:Bind 绑定对象, 通过 Binding 绑定集合, 通过 x:Bind 绑定集合 作 ...
- 绑定: 通过 Binding 绑定对象, 通过 x:Bind 绑定对象, 通过 Binding 绑定集合, 通过 x:Bind 绑定集合
背水一战 Windows 10 之 绑定 通过 Binding 绑定对象 通过 x:Bind 绑定对象 通过 Binding 绑定集合 通过 x:Bind 绑定集合 示例1.演示如何通过 Bindin ...
- 带搜索功能,支持绑定对象到节点的TreeView辅助类
特点: 1.支持数叶子节点与对象绑定 2.支持xml导入,且数据类相关的xml可自定义,只和泛型的实现有关 3.支持节点搜索功能,可在树结构上要求只显示部分节点 4.用C#编写,但与平台关联性低,可移 ...
- Firemonkey绑定对象列表
在实现Firemonkey绑定对象列表的过程中,我遇到的一些现有教程当中没有提到的细节,分享一下. 1.追加对象 用Navigator插入记录,位置总是在当前记录之前插入,没有在最后追加一个对象的方法 ...
- element-ui 使用 Select 组件给 value 属性绑定对象类型
qq_36437172 2020-06-28 22:38:49 778 收藏 分类专栏: element-ui 文章标签: element-ui Select 组件 value 属性 绑定 对象类 ...
- EasyUI 中 DataGrid 控件 列 如何绑定对象中的属性
EasyUI 中 DataGrid 控件 是我们经常用到的控件之一, 但是 DataGrid 控件 在绑定显示列时却不支持对象属性绑定. 模型如下: public class Manager impl ...
- spring mvc各种常见类型参数绑定方式以及json字符串绑定对象
在使用spring mvc作为框架的时候,为了规范,我们通常希望客户端的请求参数符合规范直接通过DTO的方式从客户端提交到服务端,以便保持规范的一致性,除了很简单的情况使用RequestParam映射 ...
- spring mvc绑定对象String转Date解决入参不能是Date的问题
使用spring的mvc,直接将页面参数绑定到对象中,对象中有属性为Date时会报错,此时需要处理下. 同样的,其他的需要处理的类型也可以用这种方法. 在controller中加入代码 @InitBi ...
- Python——面向对象、绑定对象、组合
1. 面向过程VS面向对象 (1)面向过程 核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了写程序的复杂 ...
随机推荐
- 阿里云接口异常-Can not find endpoint to access
最近在做公司的资产盘点,需要请求阿里云的接口获取公司的云服务器信息.在获取实例列表的过程中,通过异常机制捕获了 Can not find endpoint to access 这个错误.经过多次排查, ...
- Windows下通过Composer安装Yii2 [ 2.0 版本 ]
安装好大于5.4或更高版本的PHP环境并开启openssl扩展.如果是Apache服务器,加载Apache的mod_ssl模块. 下载Composer并安装. 开始->运行[或者WIN+R]-& ...
- Crypto 加密解密
import binascii from Crypto.Cipher import AES #秘钥,此处需要将字符串转为字节 from utils import config from utils.e ...
- 【转】java接口的性能测试
这周尝试了一把性能测试,之前都是测试网站的性能测试,java接口的性能测试还是头一次,学到了很多,特此分享一下. 主要用到了两个性能测试工具,一个是jmeter,一个是LoadRunner. 使用jm ...
- 用python编写简单爬虫
需求:抓取百度百科python词条相关词条网页的标题和简介,并将数据输出在一个html表格中 入口页:python的百度词条页 https://baike.baidu.com/item/Python/ ...
- Oracle常见的表连接的方法
1 排序合并连接SMJ Sort merge join 排序合并总结: 1 通常情况下,排序合并连接的效率远不如hash join,前者适用范围更广,hj只使用于等值连接,smj范围更广(<,& ...
- SQL Server 2008怎么自动备份数据库
在SQL Server 2008数据库中.为了防止数据的丢失我们就需要按时的来备份数据库了.要是每天都要备份的话,人工备份会很麻烦的,自动备份的话就不需要那么麻烦了,只 要设置好了,数据库就会自动在你 ...
- VS2010调用halcon的时候出现试图加载格式不正确的程序(this.hWindowControl1 = new HalconDotNet.HWindowControl();)
[重要错误修改] /// <summary> /// 设计器支持所需的方法 - 不要 /// 使用代码编辑器修改此方法的内容. /// </summary> private v ...
- C++深度解析教程学习笔记(3)函数的扩展
1.内联函数 1.1.常量与宏的回顾 (1)C++中的 const 常量可以替代宏常数定义,如: ; //等价于 #define A 3 (2)C++中是否有解决方案,可以用来替代宏代码片段呢? 1. ...
- 关于linux创建用户的有趣事情!
小博主今天接受了一项光荣的任务!为什么说是光荣任务呢?因为这个任务是需要创建一个linux用户!!! 肯定有小伙伴要嘲笑了!创建一个用户有什么难的啊! 对!这个并不难,即使是小白也能轻松应对! 但是! ...