上下文:this关键字通常指向当前函数的拥有者,把拥有者叫做执行上下文。

this代表函数运行时自动生成的内部对象,只能在函数内部使用。

构造函数中的this 指 构造函数的实例对象。javascript存在定义时上下文和运行时上下文。

函数的 call 和 apply 方法 可以改变上下文执行对象。可以在自定义上下文中执行函数,call 函数需要参数列表,apply 需要一个数组参数。
调用对象的一个方法,以另一个对象替换当前对象,更改对象this指向的内容。以某个方法当做指定的某个对象的方法被执行。

var pet = {
words:'…………',
speak:function(say){
console.log(say + ' ' + this.words)
}
} pet.speak('Speak'); var dog = {
words:"Wang",
} pet.speak.call(dog,'Speak') // 输出: Speak Wang

  

pet.speak.call(dog,'Speak')
调用的方法是: pet.speak ,理论上说 this 指向pet对象, 但是通过call 改变了执行上下文,把 this指针 指向了 dog 。使 dog对象 有了pet的speak方法 。第二个 ‘Speak’ 是前面的方法 pet.speak 的参数。

通过call或者apply 赋给第一个对象参数 dog 一种能力,即该对象可以调用 前面的方法 的能力。
通过call或者apply 方式,所指定的对象 dog ,这个对象是调用某个方法时,用这个对象作为该方法的上下文。

上面的方法是函数使用的时候才改变 this 对象,以下的程序是在函数定义的时候改变this上下文。

利用call 或者apply 改变 this  上下文的特性 可以实现继承。

function Pet(name,words){
this.name = name;
     this.words = words;
this.speak = function(){
console.log(this.name + " say: " + this.words);
}
}

var pet = new Pet('Cat','MIAO');
pet.speak(); //输出: Cat say: MIAO
function Dog(words){
Pet.call(this, words); //把Pet 里面的this 指向当前的 this对象,即 Dog 对象,使 Dog 拥有Pet 的方法。
//Pet.apply(this,arguments)
} var dog = new Dog('Wang'); // call 实现了继承。具有 Pet 的方法。 dog.speak() // 输出: Wang say: undefined

  

this上下文,以及通过call 、apply 实现继承的更多相关文章

  1. 在js中通过call或者apply实现继承

    通过call或者apply可以实现函数里面this的改变,利用这一特点,可以实现继承 代码如下所示: /*父类*/ function Parent(add,net,no,teacher) { this ...

  2. 上下文调用(call , apply , bind)

    var arr = []; var obj = { '0':'零', '1':'一', 'a':'sdsd', length : 2 } console.log( arr.push.call(obj, ...

  3. js中继承的几种用法总结(apply,call,prototype)

    一,js中对象继承 js中有三种继承方式 1.js原型(prototype)实现继承 <SPAN style="BACKGROUND-COLOR: #ffffff">& ...

  4. js中继承的方法总结(apply,call,prototype)

    一,js中对象继承 js中有三种继承方式 1.js原型(prototype)实现继承 代码如下: <SPAN style="<SPAN style="FONT-SIZE ...

  5. js继承之call,apply和prototype随谈

    在js中,call,apply和prototype都可以实现对象的继承,下面我们看一个例子: function FatherObj1() { this.sayhello = "I am jo ...

  6. js_继承

    一,js中对象继承 js中有三种继承方式 1.js原型(prototype)实现继承 复制代码代码如下: <SPAN style="<SPAN style="FONT- ...

  7. call(),apply(),bind()与回调

    1.call(),apply(),bind()方法 JavaScript 中通过call或者apply用来代替另一个对象调用一个方法,将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定 ...

  8. 转载Javascript继承两种形式详解

    一直想对Javascript再次做一些总结,正好最近自己写了一个小型Js UI库,总结了一下Js的继承机制,在网上也看了一些前辈们博客里的总结,感觉分析不是特别全面.这里仅仅是把自己的学习体会拿出来分 ...

  9. 转载 Javascript继承两种形式详解

    一直想对Javascript再次做一些总结,正好最近自己写了一个小型Js UI库,总结了一下Js的继承机制,在网上也看了一些前辈们博客里的总结,感觉分析不是特别全面.这里仅仅是把自己的学习体会拿出来分 ...

随机推荐

  1. Hybrid App移动应用开发初探

    一.移动App类型及其优缺点 1.1 Native App Native App(原生App)是用原生语言(Object-C/Java/C#/....)开发,用户需要下载安装的手机应用. 优点是 可以 ...

  2. 新开了一个ABP交流的QQ群(579765441 ),欢迎加入

    因为ABP架构设计交流群人数一直爆满,很多想交流ABP的朋友无法加进群里, 刚新建了一个QQ群,群号579765441 (ABP架构设计交流群2),欢迎对ABP感兴趣的朋友加入. 欢迎加QQ群: AB ...

  3. Redis 发布订阅用法

    一.发布订阅模型发布订阅其作用是为了减少依赖关系,通常也叫观察者模式.主要是把耦合点单独抽离出来作为第三方,隔离易变化的发送方和接收方. 发送方:只负责向第三方发送消息.(杂志社把读者杂志交给邮局)接 ...

  4. CI Weekly #3 | 关于微服务、Docker 实践与 DevOps 指南

    CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分享,包括国内外持续集成.持续交付,持续部署.自动化测试. DevOps 等实践教程.工具与资源,以及一些工程师文化相关的程序员 Ti ...

  5. Trace1:Default Trace

    sql server trace 是一个轻量级的追踪工具,对追踪数据库的行为很有用,因此,sql server内置一个trace(default trace). 1,sql server 内置Defa ...

  6. SQL Server 2014新特性探秘(1)-内存数据库

    简介    SQL Server 2014提供了众多激动人心的新功能,但其中我想最让人期待的特性之一就要算内存数据库了.去年我再西雅图参加SQL PASS Summit 2012的开幕式时,微软就宣布 ...

  7. C指针(二)

    原文链接:http://www.orlion.ga/924/ 一.指针与const限定符 const限定符与指针结合起来常见的情况有一下几种: const int *a; int const *a; ...

  8. Android启动模式

    在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启动模式决定了Activity的启动运行方式. An ...

  9. java中volatile关键字

    一.前言 JMM提供了volatile变量定义.final.synchronized块来保证可见性. 用volatile修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最的值.volatil ...

  10. 使用Genymotion调试出现错误INSTALL_FAILED_CPU_ABI_INCOMPATIBLE解决办法

    需要下载Genymotion-ARM-Translation_v1.1.zip  ARM插件包 用于安装ARM架构的程序,将下载好的zip包用鼠标拖到虚拟机窗口中,出现确认对跨框点OK就行.然后重启你 ...