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)面向过程 核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了写程序的复杂 ...
随机推荐
- Java 虚拟机-垃圾收集算法
本文主要介绍Java虚拟机的垃圾回收算法. 一.概述 二.标记-清除算法 Mark-Sweep.如同名字,该算法分两步: 标记:标记处需要回收的对象 清除:标记完成后统一回收被标记的对象. 缺点: 效 ...
- RK3288 Android5.1系统编译
输入指令时一定要注意当前路径 1.编译之前需要安装JDK7,并配置JAVA环境变量. xxx@build:~/RK3288$ export JAVA_HOME=/usr/lib/jvm/java-7- ...
- gen_server的一些心得
gen_server并不是我原来概念中的tcp_server或者udp_server的概念,只是一个纯粹的消息服务器,另外,附上它的一些回调函数的简单说明参考地址 http://hi.baidu.co ...
- 学习FPGA需要做哪些
有些人比较差,做了一些介绍,有误导成分.有些人水平太高,介绍的很好,但是很多人依旧听不懂,得到的肯定很少.学习FPGA,在不同层次的人明显有不同的答案. 熟悉硬件描述语言语法,不需要什么都会,但是要记 ...
- GOF23设计模式之单例模式(singleton)
一.单例模式概述 保证一个类只有一个实例,并且提供一个访问该实例的全局访问点. 由于单例模式只生成一个实例,减少了系统性能开销.所以当一个对象的产生需要比较多的资源时,如读取配置.产生其他依赖对象时, ...
- 用一两句话说一下你对“盒模型”这个概念的理解,和它都涉及到哪些css属性
网页设计中常听的属性名:内容(content).填充(padding).边框(border).边界(margin), CSS盒子模式都具备这些属性. 这些属性我们可以用日常生活中的常见事物——盒子作一 ...
- Java 查询数据后进行递归操作
java的递归方法记录: private List<Map<String, Object>> generateOrgMapToTree(List<Map<Strin ...
- 1.3Broker
Celery需要一种解决消息的发送和接受的方式,我们把这种用来存储消息的的中间装置叫做message broker, 也可叫做消息中间人. 作为中间人,我们有几种方案可选择: 1.RabbitMQ R ...
- DIV+CSS+JS实现图片<ul><li></li></ul>无缝滚动代码
(含上下左右滚动代码) <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:/ ...
- Pandas:表计算与数据分析
目录 Pandas之Series Pandas之DataFrame 一.pandas简单介绍 1.pandas是一个强大的Python数据分析的工具包.2.pandas是基于NumPy构建的. 3.p ...