面向对象之---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后台重定向方式
1.直接返回值中加重定向:"redirect:要访问的网址"; public String updateOrAddProject() { return "redirect ...
- ieTESTER浏览器使用ie6崩溃问题
打开浏览器在选项--internet属性--连接--局域网设置--将自动检测设置的对勾勾掉就可以 重启下浏览器
- MongoDB 学习笔记之 删除数据,集合,数据库
删除数据,集合,数据库: 删除一个文档: db.media.deleteOne({"name": "Sky"}) 删除多个文档: db.media.delete ...
- UE制作PBR材质攻略Part 1 - 色彩知识
目录 一.前言 二.色彩知识 2.1 色彩理论 2.1.1 成像原理 2.1.2 色彩模型和色彩空间 2.1.3 色彩属性 2.1.4 直方图 2.1.5 色调曲线 2.1.6 线性空间与Gamma空 ...
- 一款功能强大的TCP/UDP工具---flynet
前言 前段时间做某个项目,由于涉及到tcp/udp方面的知识比较多,于是就索性趁热打铁,写个工具来强化相关知识.另外由于并非十分擅长Golang,所以也顺便再了解下Golang吧. 简介 flynet ...
- xamarin开发的mac开发小工具集合
兄弟们我拖控件拖到了mac系统去了, 工具上传到百度网盘,下载地址 链接:https://pan.baidu.com/s/1Q64zoRjE3u66jJnzF8rhww提取码:ljx2 这款工具我是用 ...
- MySql权限丢失问题解决
参考文章 [mysql] root权限丢失恢复 完全菜鸟教程 今天用root账户登录到mysql后, show databases 命令返回的只有两个表, 然后使用 use database 命令提示 ...
- vue3.0的安装使用
关于旧版本 Vue CLI 的包名称由 vue-cli 改成了 @vue/cli. 如果你已经全局安装了旧版本的 vue-cli (1.x 或 2.x),你需要先通过 npm uninstall vu ...
- jsonp与cors跨域解析
1.浏览器的同源安全策略 没错,就是这家伙干的,浏览器只允许请求当前域的资源,而对其他域的资源表示不信任.那怎么才算跨域呢? 请求协议http,https的不同 域domain的不同 端口port的不 ...
- hihoCode 1075 : 开锁魔法III
时间限制:6000ms 单点时限:1000ms 内存限制:256MB 描述 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅 ...