面向对象之---this的用法
全局环境
无论是否在严格模式下,在全局执行环境中,this都指向全局对象·
在全局作用域中调用一个函数时,this总是指向Global对象(在浏览器中指向window)
函数(运行内)环境
在函数内部,this的值取决于函数被调用的方式
1.简单调用
非严格模式
function f1() {
console.log(this);
}
// 在浏览器环境
f1();//window
// 在Node环境
f1();//global
严格模式
在严格模式下,如果this没有被执行环境(execution context)或者称为上下文,this会保持它进入执行环境时的值,所以下面this会被默认为undefined
function f2() {
'use strict';
console.log(this);
}
f2(); //undefined
使用call()或者apply()方法,改变this的指向
// 如果想把this的值从一个环境传到另一个,就可以调用call()或者apply()方法
var o = {
a: 'Customs'
};
var o1 = {
a: 'Customs1'
};
var o2 = {
a: 'Customs2'
};
var a = 'Global';
function whatThis(arg) {
console.log(this.a);
} whatThis(); //Global
whatThis.call(o); //Customs
whatThis.apply(o); //Customs
whatThis.call(o1); //Customs1
whatThis.apply(o1); //Customs1
whatThis.call(o2); //Customs2
whatThis.apply(o2); //Customs2
call 和 apply 函数的时候要注意,如果传递给 this 的值不是一个对象,JavaScript 会尝试使用内部 ToObject 操作将其转换为对象。7 或 'foo',那么就会使用相关构造函数将它转换为对象,所以原始值 7 会被转换为对象,像 new Number(7) 这样,而字符串 'foo' 转化成 new String('foo') 这样,function bar() {
console.log(Object.prototype.toString.call(this));
}
//原始值 7 被隐式转换为对象
bar.call(7); // [object Number]
2.作为对象的方法调用
当函数作为对象的方法调用,他们的this是调用该函数的对象
var x4 = 44;
function f4() {
console.log(this.x4); //{x:55,say:f4} this指向o4
}
var o4 = {};
o4.x4 = 55;
o4.say = f4;
o4.say(); //
var x5 = 56;
var o5 = {
x5: 66,
f5: function() {
console.log(this) // {x5:66,f5:f} this指向o5 // console.log(this.x5);//66
return this.x5;
}
}; console.log(o5.f5()); //
对于原型链上某处定义的方法,同样也适用, 如果该方法存在于对象的原型链上,那么this的指向的是调用该方法的对象
var oo = {
f: function() {
return this.a + this.b;
}
};
var p = Object.create(oo);
p.a = 1;
p.b = 2;
console.log(p.f()); //
// 解析:对象p没有自己的f属性,该属性继承自原型,
// 对于f的查找过程中,最终在对象oo中找到f属性,查找的过程是p.f的引用开始的,所以this指向p
// 也就是说,因为f是作为p的方法调用的,所以this指向p
function sum() {
console.log(this); //{a: 1,average: 2,b: 2, c: 3,sum: 6}
return this.a + this.b + this.c;
}
var oo1 = {
a: 1,
b: 2,
c: 3,
get average() {
console.log(this);//{a: 1,average: 2,b: 2, c: 3,sum: 6}
return (this.a + this.b + this.c) / 3;
}
};
Object.defineProperty(oo1, 'sum', {
get: sum,
enumerable: true,
configurable: true
});
console.log(oo1.average, oo1.sum); // 2,6
3.作为构造函数
当一个函数作为构造函数时(使用new关键字),他的this指向用构造函数创建的对象
function Test() {
this.x = 3;
}
var obj1 = new Test();
console.log(obj1.x); //
// 解析:this指向Test的实例,即obj1
obj1.x = 5;
console.log(obj1.x); //
4.bind()方法
ES5引入Function.prototype.bind()
调用 f.bind()方法会创建一个与 f具有相同的函数体和作用域的函数
但是在这个函数中,this将永久性的被绑定到了bind的第一个参数,无论函数是怎么样调用的
var a3 = 'Global';
function f3() {
console.log(this.a3); //zhangsan
return this.a3;
} var g = f3.bind({ a3: 'zhangsan' });
console.log(g()); // zhangsan var h = g.bind({ a3: 'haha' }); // bind只生效一次,再次修改也不会生效
console.log(h()); // zhangsan var o3 = {
a3: 37,
f3: f3,
g: g,
h: h
};
console.log(o3.f3(), o3.g(), o3.h()); // 37,"zhangsan","zhangsan"
5.作为一个DOM时间处理函数
当函数被用作事件处理函数时,它的this指向触发事件的元素
6.作为一个内联事件处理函数
当代码被内联on-event 处理函数调用时,它的this指向监听器所在的DOM元素
面向对象之---this的用法的更多相关文章
- php面向对象_get(),_set()的用法
一般来说,总是把类的属性定义为private,这更符合现实的逻辑.但是,对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数“__get()”和“__set()”来获取和赋值其属性, ...
- Python 抽象篇:面向对象之高阶用法
1.检查继承 如果想要查看一个类是否是另一个类的子类,可以使用内建的issubclass函数 如果想知道已知类的基类,可以直接使用特殊特性__bases__ 同时,使用isinstance方法检查一个 ...
- Python——面向对象、绑定对象、组合
1. 面向过程VS面向对象 (1)面向过程 核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了写程序的复杂 ...
- PHP中__get()和__set()的用法实例详
刚刚看到一个对我有用的文章,我就把它摘抄下来了. php面 ...
- PHP中__get()和__set()的用法实例详解
php面向对象_get(),_set()的用法 一般来说,总是把类的属性定义为private,这更符合现实的逻辑.但是,对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数“__ge ...
- js面向对象篇(一)
Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类). ----摘 ...
- 编程体系结构(06):Java面向对象
本文源码:GitHub·点这里 || GitEE·点这里 一.基础概念 1.面向对象概念 面向对象编程的主要思想是把构成问题的各个事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙一 ...
- Mongodb 副本集分片(一)---初始化mongodb安装启动
写在前面:mongodb是nosql非关系型数据库中,比较受欢迎的产品.在数据持久化及与关系型数据库的关联上也做的比较好,目前各大公司在存放二进制文件(图片.视频等)中应用也比较广泛.其遵循的key- ...
- javascript中的闭包,超简单论述,保证小学生必懂
js中的闭包已经有很多论断了,大家伙有没有听懂了,先引用一片比较高端 的 ”汤姆大叔“ 深入理解JavaScript系列(16):闭包(Closures) 好了,为了引起大家的兴趣,先来小诗一首 v ...
随机推荐
- Spring 梳理-启用MVC
启用注解启动的Spring MVC xml <mvc:annotation-dirven> <mvc:annotation-driven /> 是一种简写形式,完全可以手动配置 ...
- 2.html5新布局元素
1.html5的优点: ①对人友好,更加语义化,更直观,增加了代码的可读性. ②对计算机友好,浏览器更容易解析,搜索引擎更容易抓取文档内容. ③代码更加的简洁. 2.新增的布局标签: Article: ...
- mybatis 常用的jabcType与javaType对应
一.jabcType与javaType对应 JDBC Type Java Type CHAR String VARCHAR ...
- Spring Boot 2.X(四):Spring Boot 自定义 Web MVC 配置
0.准备 Spring Boot 不仅提供了相当简单使用的自动配置功能,而且开放了非常自由灵活的配置类.Spring MVC 为我们提供了 WebMvcConfigurationSupport 类和一 ...
- golang面试题--string操作
题目: 请实现一个算法,确定一个字符串的所有字符[是否全都不同].这里我们要求[不允许使用额外的存储结构].给定一个string,请返回一个bool值,true代表所有字符全都不同,false代表存在 ...
- 从零开始的 phpstorm+wamp 组合下的debug环境搭建(纯小白向)
本文主要是为了帮自己记住每次重装系统后需要干点啥,如果能帮到你,烦请给个好评 环境说明: 1. windows10 64bit 2. wampservers 3.0.6(x86) apache2.4. ...
- Jenkins设置BUILD NUMBER初始值
由于服务器迁移,需要将之前的Jenkins构建项目一并迁移,为了区分构建编号,需要将所有项目的BUILDE NUMBER 初始值定义. 网上有一些资料是更新单个项目的,我们这项目几百个,所以只好自己研 ...
- 部署主从dns
主机部署:yum安装DNS服务和依赖 [admin@haifly-bj-dns1 ~]$ sudo yum install bind-chroot启动named-chroot服务 [admin@hai ...
- python常用算法学习(4)——数据结构
数据结构简介 1,数据结构 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成.简单来说,数据结构就是设计数据以何种方式组织并存贮在计算机中.比如:列表,集合与字 ...
- Django高级实战 开发企业级问答网站 ✌✌
Django高级实战 开发企业级问答网站 (一个人学习或许会很枯燥,但是寻找更多志同道合的朋友一起,学习将会变得更加有意义✌✌) 从实际需求分析开始,实现当今主流知识问答应用的功能,包括动态.文章.问 ...