第二章:this、call和apply

  • this
    JS的this总是指向一个对象,而具体指向哪个对象是在运行时基于函数的执行环境动态绑定的,而非函数被声明时的环境。
  • this指向的四种情况
  1. 作为对象的方法调用
var obj={a:1,getA:function(){alert(this===obj); //truealert(this.a)      //1}
};obj.getA();
  1. 作为普通函数调用
// 1.
window.name='globalName';var getName=function(){return this.name;
}console.log(getName());   //globalName// 2.
window.name='globalName';var myObject={name:'sven',getName:funtion(){return this.name;}
};var getName=myObject.getName;
console.log(getName());    //globalName// 3.
<html><body><div id="div1">我是一个div</div></body><script>window.id='window';document.getElementById('div1').onclick=function(){alert(this.id);var callback=function(){alert(this.id);     //window  }callback();};</script>
</html>// 3的解决方案
document.getElementById('div1').onclick=function(){var that=this;  //保存div的引用var callback=function(){alert(that.id);    //div1}callback();
};
  1. 构造器调用
var MyClass=function(){this.name='sven';
};var obj=new MyClass();
alert(obj.name);     //sven// 显式返回object类型的对象
var MyClass=function(){this.name='sven';return {   //显式地返回一个对象name:'anne';};var obj=new MyClass();alert(obj.name);    //anne
}
  1. Function.prototype.call或Function.prototype.apply调用
var obj1={name:'sven',getName:function(){return this.name;};
};var obj2={name:'anne'
};console.log(obj1.getName());   //sven
console.log(obj1.getName.call(obj2));    //anne
  • call和apply
  1. 当使用call或apply的时候,如果我们传入的第一个参数为null,函数体内的this会指向默认的宿主对向,在浏览器中则是window
// Function.prototype.call
var func=function(a,b,c){alert([a,b,c]);     //[1,2,3]
};func.apply(null,[1,2,3]);//Function.prototype.apply
var func=function(a,b,c){alert([a,b,c]);     //[1,2,3]
};func.call(null,1,2,3)
  1. 有时候我们使用call或apply的目的不在于指定this指向,而是另有用途,比如借用其他对象的方法
  • call和apply的用途
  1. 改变this指向
var obj1={name:'sven'
};var obj2={name:'anne'
};window.name='window';var getName=function(){alert(this.name);
};getName();
getName.call(obj1);
getName.call(obj2);
  1. 借用其他对象的方法
// 第一种
var A=function(name){this.name=name;
};var B=function(){A.apply(this,arguments);
};B.prototype.getName=function(){return this.name;
};var b=new B('sven');
console.log(b.getName());//第二种
(function(){Array.prototype.push.call(arguments,3);console.log(arguments);
})(1,2);//ArrayPush这个对象至少要满足
//①对象本身要可以存取属性
//②对象的length属性可读写
  1. Function.prototype.bind
Function.prototype.bind=function(context){var self=this;return function(){return self.apply(context,arguments);}
};var obj={name:'sven'
};var func=function(){alert(this.name);    //sven
}.bind(obj);func();

(JS设计模式与开发实践笔记)第二章相关推荐

  1. js设计模式与开发实践(读书笔记)

    1 面向对象的js 1.1 动态类型语言和鸭子类型 编程语言按数据类型可分成静态类型和动态类型语言,其中js属于动态类型语言,对一个变量赋值时,不需要考虑其类型. 鸭子类型: 通俗理解,只要走起路来像 ...

  2. JavaScript设计模式与开发实践 | 02 - this、call和apply

    this JavaScript的this总是指向一个对象,至于指向哪个对象,是在运行时基于函数的执行环境的动态绑定的,而非函数被声明时的环境. this的指向 this的指向大致可以分为以下4类: 作 ...

  3. JavaScript设计模式与开发实践(网课学习)

    Js设计模式与开发实践 面向对象 5大设计原则 23种设计模式(实际只有21种) 设计模式主要分为下面三大类 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模 ...

  4. JS代理模式《JavaScript设计模式与开发实践》阅读笔记

    代理模式 代理模式是为一个对象提供一个代用品或占位符,以便控制对它的访问. 保护代理和虚拟代理 保护代理:当有许多需求要向某对象发出一些请求时,可以设置保护代理,通过一些条件判断对请求进行过滤. 虚拟 ...

  5. javascript设计模式(javascript设计模式与开发实践读书笔记)

    javascript设计模式(javascript设计模式与开发实践读书笔记) 单例模式 策略模式 代理模式 迭代器模式 发布-订阅模式 命令模式 组合模式 模板方法模式 享元模式 职责链模式 中介者 ...

  6. 读书笔记——《Python编程从入门到实践》第二章

    读书笔记--<Python编程从入门到实践>第二章 读书笔记--<Python编程从入门到实践>第二章 变量 如何使用变量 如何规范变量命名 字符串 字符串是什么 如何修改字符 ...

  7. Web前端开发笔记——第二章 HTML语言 第四节 超链接标签

    目录 前言 一.超链接标签 (一)链接其它子网页 (二)链接其它站点 (三)虚拟超链接 二.从当前页面链接到指定位置 三.链接的访问情况 四.在新窗口中打开链接 例题 结语 前言 本节介绍超链接标签即 ...

  8. [go学习笔记.第二章] 2.go语言的开发工具以及安装和配置SDK

    一.工具介绍: 1.Visual Studio Code 一个运行于Mac,Windows,和linux上的,默认提供Go语言的语法高亮的IED,可以安装Go语言插件,还可以支持智能提示,编译运行等功 ...

  9. Android群英传笔记——第二章:Android开发工具新接触

    Android群英传笔记--第二章:Android开发工具新接触 其实这一章并没什么可讲的,前面的安装Android studio的我们可以直接跳过,如果有兴趣的,可以去看看Google主推-Andr ...

最新文章

  1. PatchMatchStereo中的深度/视差传播策略
  2. numpy.where()用法
  3. 还需要“注意力层”吗?一堆“前馈层”在ImageNet上表现得出奇得好
  4. npm run buil构建后页面白屏_从Npm Script到Webpack,6种常见的前端构建工具对比
  5. sql分类及基本sql操作,校对规则(mysql学习笔记二)
  6. sublime配置c++环境
  7. C#中PostMessage和SendMessage的参数传递实例
  8. 用C#(.NET Core) 实现简单工厂和工厂方法设计模式
  9. SSE图像算法优化系列十八:三次卷积插值的进一步SSE优化。
  10. cheaklist 人机交互界面_10个人机交互系统及界面的设计方案
  11. 内置模块之configparser
  12. g120宏的说明书_西门子变频器G120操作说明书
  13. KUKA WorkVisual 编程教学
  14. chm文件导入java_java API的chm文件制作
  15. python中iter是什么意思_Python __iter__ 深入理解
  16. R语言 cor与lm
  17. MAML算法详解(元学习)
  18. 工作自动扩张的时间管理与柳比歇夫时间记录统计(时间管理讲座笔记)
  19. 笔记2 IKAnalyzer扩展词库
  20. 两个决策树例题经典案例-代码示例

热门文章

  1. 57 Hive案例(数据ETL)
  2. 安装nginx-kafka插件ngx_kafka_module笔记
  3. 空间计量 python_stata进行空间计量分析
  4. 转 The C10K problem 中文版 - 如何处理高并发连接
  5. 1.2 国内外研究现状与水平
  6. Java项目:SSH在线运动健身管理系统
  7. Android直播中短视频源码的功能实现
  8. 西南大学计算机学,2020年西南大学计算机应用技术考研经验分享
  9. Android分割线View
  10. STM32F4的GPIO使用