• 1.改变this指向
  • 2.Function.prototype.bind
  • 3.借用其他对象方法
    • 1.借用实现继承
    • 2.实现恶心的
      • Array.prototype.push.call
      • Array.prototype.join.call
      • Array.prototype.slice.call
      • Object.prototype.toString.call

1.改变this指向

  1. var obj1 = {
  2. name:"Bob marley"
  3. };
  4. var obj2 = {
  5. name:"Bob Dylan"
  6. };
  7. var name = "David Bowie";
  8. var getName = function(){
  9. console.log(this.name);
  10. }
  11. getName(); //输出undefined
  12. getName.call(obj1); //输出Bob marley
  13. getName.call(obj2); //输出Bob Dylan

在实际开发中,经常会遇到this指向被不经意改变的场景:例如:

  1. document.getElementById('div1').onclick=function(){
  2. alert(this.id); //输出div1
  3. var func = function(){
  4. alert(this.id); //输出undefined
  5. }
  6. func();
  7. };

使用call来修复func函数内的this,使其指向div

  1. document.getElementById('div1').onclick=function(){
  2. alert(this.id);
  3. var func = function(){
  4. alert(this.id);
  5. }
  6. func.call(this);
  7. };
  8. 再如:
  9.  
  10. var name = "SmarTom";
  11. var func = function(){
  12. console.log(this.name);
  13. }
  14. func();

使用call来修复func函数内的this,使其指向div 再如:

  1. var obj ={
  2. name : "SmarTom"
  3. }
  4. var func = function(){
  5. console.log(this.name);
  6. }
  7. func.call(obj);

2.Function.prototype.bind

大部分浏览器都实现了内置的Function.prototype.bind,用来指定函数内部的this指向 即使没有原生的Function.prototype.bind实现,也可以模拟一下,例如:

  1. //在一些浏览器中可以忽略 bind函数
  1. Function.prototype.bind = function(context){
  2. var _self = this;
  3. return function(){
  4. return _self.apply(context,arguments);
  5. }
  6. }
  7. var obj = {
  8. name :"SmarTom"
  9. }
  10. var func = function(){
  11. console.log(this.name);
  12. }.bind(obj); //进行绑定
  13. func();
  1.  

3.借用其他对象的方法【实现继承】

1.借用实现继承

  1. var A = function(name){ //父类 A
  2. this.name = name;
  3. }
  4. var B = function(){ //子类 B 继承父类A
  5. A.apply(this,arguments);
  6. }
  7. B.prototype.getName = function(){ //B方法
  8. return this.name;
  9. }
  10. var b = new B('asdfasdfasdf');
  11. console.log(b.getName());

2.实现

  1. Array.prototype.push.call
  2. Array.prototype.join.call
  3. Array.prototype.slice.call
  4. Object.prototype.toString.call()
  5.  
  6. 1. Array.prototype.push.call
  7. Array.prototype.push.call(obj,arguments)
  8. 相当于var html = []; html.push(那一大堆)
  9. <script type="text/javascript">
  10. (function () {
  11. var customService = function () {
  12.  
  13. };
  14. customService.prototype = {
  15. open: function () {
  16. contents: this._getHtml(),
  17. },
  18. close: function () {
  19.  
  20. },
  21. _getHtml: function () {
  22. var html = [];
  23. Array.prototype.push.call(html,
  24. '<div class=\"content\">',
  25. '<div>1、</div>',
  26. '<div>2、<\/div>',
  27. '<div>3、<\/div>',
  28. '<div>4、<\/div>',
  29. '<\/div>'
  30. );
  31. return html.join('');
  32. }
  33. };
  34. window.CustomService = new customService();
  35. })();
  36. </script>
  37.  
  38. 2.Array.prototype.join.call
  39. //arguments就相当于一个对象数组
  40. Array.prototype.join.call(arguments,',')
  41. 就类似于window.join方法.apply,call不会改变scope,可参考finally里的内容
  42. <script type="text/javascript">
  43. var join = function () {
  44. for (var i = 0, b = ''; i < this.length ; i ++) {
  45. if (i) b+= arguments[0];
  46. b += this[i];
  47. }
  48. return b;
  49. };
  50.  
  51. var show = function () {
  52. //new Array(arguments)).join('_');
  53. //try
  54. try {
  55. alert(
  56. Array.apply(null, arguments).join('_')
  57. );
  58. return join.call(arguments, '-'); //Array.prototype.join就类似于window.join方法.apply,call不会改变scope,可参考finally里的内容
  59. } finally {
  60. var func = function () {
  61. alert(a);
  62. };
  63.  
  64. void function () {
  65. var a = 1;
  66. try {
  67. func.call(this);
  68. } catch (exp) {
  69. alert(exp.message);
  70. }
  71. }();
  72. }
  73. };
  74.  
  75. alert(show(1, 2, 3, 5));
  76. </script>
  77.  
  78. 3.Array.prototype.slice.call
  79. var a={length:2,0:'first',1:'second'};
  80. Array.prototype.slice.call(a);// ["first", "second"]
  81. var a={length:2};
  82. Array.prototype.slice.call(a);// [undefined, undefined]
  83. 可能刚开始学习js的童鞋并不是很能理解这句为什么能实现这样的功能。
  84. 比如我就是一个,所以,来探究一下。
  85. 首先,slice有两个用法,一个是String.slice,一个是Array.slice
  86. 第一个返回的是字符串,第二个返回的是数组,这里我们看第2个。
  87. Array.prototype.slice.call(arguments)能够将arguments转成数组,那么就是arguments.toArray().slice();
  88. 到这里,是不是就可以说Array.prototype.slice.call(arguments)的过程就是先将传入进来的第一个参数转为数组,再调用slice
  89.  
  90. 4.Object.prototype.toString.call
  91. 使用Object.prototype上的原生toString()方法判断数据类型,使用方法如下:
  92.  
  93. Object.prototype.toString.call(value)
  94.  
  95. 1.判断基本类型:
  96.  
  97. Object.prototype.toString.call(null);//”[object Null]”
  98. Object.prototype.toString.call(undefined);//”[object Undefined]”
  99. Object.prototype.toString.call(“abc”);//”[object String]”
  100. Object.prototype.toString.call(123);//”[object Number]”
  101. Object.prototype.toString.call(true);//”[object Boolean]”
  102. 2.判断原生引用类型:
  103.  
  104. 函数类型
  105. Function fn(){console.log(“test”);}
  106. Object.prototype.toString.call(fn);//”[object Function]”
  107. 日期类型
  108. var date = new Date();
  109. Object.prototype.toString.call(date);//”[object Date]”
  110. 数组类型
  111. var arr = [1,2,3];
  112. Object.prototype.toString.call(arr);//”[object Array]”
  113. 正则表达式
  114. var reg = /[hbc]at/gi;
  115. Object.prototype.toString.call(arr);//”[object Array]”
  116. 自定义类型
  117. function Person(name, age) {
  118. this.name = name;
  119. this.age = age;
  120. }
  121. var person = new Person("Rose", 18);
  122. Object.prototype.toString.call(arr); //”[object Object]”
  123. 很明显这种方法不能准确判断personPerson类的实例,而只能用instanceof 操作符来进行判断,如下所示:
  124. console.log(person instanceof Person);//输出结果为true
  125. 3.判断原生JSON对象:
  126.  
  127. var isNativeJSON = window.JSON && Object.prototype.toString.call(JSON);
  128. console.log(isNativeJSON);//输出结果为”[object JSON]”说明JSON是原生的,否则不是;
  129.  
  130. 注意:Object.prototype.toString()本身是允许被修改的,而我们目前所讨论的关于
  131. Object.prototype.toString()这个方法的应用都是假设toString()方法未被修改为前提的。

《JavaScript设计模式与开发》笔记 3.call和apply的更多相关文章

  1. JavaScript设计模式与开发实践(二)——apply&&call

    call和apply的用途 改变this指向 先看个例子: var obj1 = { name: 'sven' }; var obj2 = { name: 'anne' }; window.name ...

  2. 《JavaScript设计模式与开发实践》读书笔记-基础知识

    笔记内容多摘录自<JavaScript设计模式与开发实践>(曾探著),侵删. 面向对象的JavaScript 1. 动态需要类型和鸭子类型 鸭子类型 如果它走起路来像鸭子,叫起来也是鸭子, ...

  3. JavaScript设计模式与开发实践——读书笔记1.高阶函数(上)

    说来惭愧,4个多月未更新了.4月份以后就开始忙起来了,论文.毕设.毕业旅行等七七八八的事情占据了很多时间,毕业之后开始忙碌的工作,这期间一直想写博客,但是一直没能静下心写.这段时间在看<Java ...

  4. 《Javascript设计模式与开发实践》--读书笔记

    第2章 this call apply bind()方法创建一个新的函数,在bind()被调用时,这个新函数的this被bind的第一个参数指定,其余的参数将作为新函数的参数供调用时使用. bind( ...

  5. 《javascript设计模式与开发实践》--- (单一职责原则)

    看的这本书叫<JavaScript设计模式与开发实践> 先规划一下看书的顺序,基础知识我已经大概的浏览了一遍了,没有留下笔记,以后有时间还会补上.本来打算顺着看的.但是我感觉我很难短时间内 ...

  6. 《JavaScript设计模式与开发实践》整理

    最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...

  7. JavaScript设计模式与开发实践 - 观察者模式

    概述 观察者模式又叫发布 - 订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个目标对象(为了方便理解,以下将观察者对象叫做订阅者,将目标对象叫做 ...

  8. JavaScript设计模式与开发实践 - 策略模式

    引言 本文摘自<JavaScript设计模式与开发实践> 在现实中,很多时候也有多种途径到达同一个目的地.比如我们要去某个地方旅游,可以根据具体的实际情况来选择出行的线路. 如果没有时间但 ...

  9. JavaScript设计模式与开发实践 - 单例模式

    引言 本文摘自<JavaScript设计模式与开发实践> 在传统开发工程师眼里,单例就是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返 ...

  10. 《JavaScript设计模式》读书笔记——灵活的语言

    最近在读JavaScript设计模式这本书,准备搞一个系列来记录所学所想,其实主要原因是方便以后查阅. 第一章主要介绍了JS函数的不同定义与使用方法,用自己的方法去模拟类也是它的独有魅力所在. 首先, ...

随机推荐

  1. python 模块基础 和常用的模块

    模块的定义 一个模块就是以.py结尾的python 文件,用来从逻辑上组织python代码.注意,模块名和变量名一样开头不能用数字,可以是双下划线和字母. 为什么要用模块? 将一些复杂的需要重复使用的 ...

  2. IK 中文分词器

    链接:https://github.com/wks/ik-analyzerIKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包.从2006年12月推出1.0版开始,IKAna ...

  3. MultipartFile(文件的上传)

    摘自:https://www.cnblogs.com/896240130Master/p/6430908.html https://blog.csdn.net/kouwoo/article/detai ...

  4. iOS常用的代码块整理

    strong @property (nonatomic,strong) <#Class#> *<#object#>; weak @property (nonatomic,wea ...

  5. mariaDB的安装 apache的安装

    1.mariaDB的安装: 下载安装包: wget -c https://downloads.mariadb.com/MariaDB/mariadb-10.3.6/bintar-linux-glibc ...

  6. 基于PaaS和SaaS研发平台体系

    基于PaaS和SaaS研发的商业云平台实战 背景介绍 SaaS.PaaS.IaaS等云服务模式已经被大家普遍认可,在研发过程中借力一些PaaS和SaaS平台,能够提升产品的研发速度和功能稳定程度.本文 ...

  7. 实验吧—Web——WP之 Guess Next Session

    打开链接,他有给出查看原码的按钮,那么我们打开看看 在这个里面,如果GET的值等于session的就会给出flag 那么我们进行抓包改包 在输入框内随意输入一个值然后抓包 将password的值删去, ...

  8. Python基础-使用paramiko

    一:简介 paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. 由于使用的是python这样的能够跨平台运行的语言,所以所有python支 ...

  9. Go Example--定时器

    package main import ( "fmt" "time" ) func main() { //定时器2s timer1 := time.NewTim ...

  10. 【java编程】加载Resources配置文件的方法

    一.加载配置实现k-v //FILTER_PROPERTY_NAME=META-INF/abc.properties private void loadFilterConfig(Properties ...