面向对象之---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 ...
随机推荐
- 隐藏select下拉框的三角按钮
修改select标签的appearance属性,改成inherit,而不是none. -moz-appearance:inherit;/*?Firefox?*/ -webkit-appearance: ...
- MySQL数据库忘记密码怎么办?
忘记MySQL数据库密码就进不去数据库,也就无法修改密码,解决方法如下: 1:打开cmd命令符,先关闭正在运行的数据库,输入如下命令: 2:打开mysql.exe和mysqld.exe所在的文件夹,复 ...
- 移动端获取短信验证码java实现——阿里云短信服务
需求:移动端输入手机号,获取验证码.点击登录,验证验证码是否输入错误.是否超时等情况,一旦校验通过,将用户数据保存到数据中(业务逻辑). 前提:注册阿里用户,开通短信服务,申请key.秘钥.签名.短信 ...
- Ajax async属性
async: 默认是true:异步,false:同步. 其他属性扩展: 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数, ...
- Python实现几种简单的排序算法
一.冒泡排序 概念:为一个无序的列表排成有序的 实现过程描述:(升序) 1.比较相邻的元素,如果第一个比第二个大,就交换他们的位置 2.对每一对相邻元素重复1的工作,从开始第一队到最后一对,最后结束的 ...
- Spring Boot 二十个注解
Spring Boot 二十个注解 占据无力拥有的东西是一种悲哀. Cold on the outside passionate on the insede. 背景:Spring Boot 注解的强大 ...
- Python调用 Openstack 主要服务(keystone,nova,glance,neutron,heat)
由于Openstack更新很快,现在准备搭建基于Queen版本的Openstack,Queen版本要求keystone版本为V3,所以之前大多数接口都不能用了,百度了一下都没有比较新的实例,官方文档又 ...
- e课表项目第二次冲刺周期第八天
昨天完成了什么? 昨天,我们组商量讨论了二层界面的设计,添加课程所需要的信息大概有:课程名称.教室.任课教师.上课时间.类型(单周.双周.单双周)以及备注等等.然后,我们通过界面的UI设计,让我们软件 ...
- Maven项目下使用log4j
Apache Log4j是一个基于Java的日志记录工具,它的日志级别按下面顺序递减: 级别 描述 OFF 最高级别,用于关闭日志记录. FATAL 将导致应用程序提前终止的严重错误的信息将立即呈现在 ...
- mac下编译openjdk8?so easy!
写在最前面的话:建议第一次编译jdk的朋友,查阅任何博客都不如认真读一遍源码中的README-builds.html 环境:macOS High Sierra(10.13.5) 编译jdk:openj ...