上下文: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. 在Visual Studio上开发Node.js程序

    [题外话] 最近准备用Node.js做些东西,于是找找看能否有Visual Studio上的插件以方便开发.结果还真找到了一个,来自微软的Node.js Tools for Visual Studio ...

  2. Improve Your Study Habits

    1.Plan your time carefully. Make a list of your weekly tasks.Then make a schedule or chart of your t ...

  3. Opengl中矩阵和perspective/ortho的相互转换

    Opengl中矩阵和perspective/ortho的相互转换 定义矩阵 Opengl变换需要用四维矩阵.我们来定义这样的矩阵. +BIT祝威+悄悄在此留下版了个权的信息说: 四维向量 首先,我们定 ...

  4. 薪资至少10K的一道题,你能拿下吗

    我所了解的华为: 应届本科生8k+ 应届硕士生10k+ 应届博士生12k+ 看到后什么感想?有没有只恨生不逢时运不佳的感觉? 很多人做3年多甚至更久,才能达到这个薪资水平,还不如一个新生. 在我看来, ...

  5. 搜狗输入法wp风格皮肤

    换了个nexus 发现输入法真的没有wp的好用 没办法,刚好搜狗输入法有定制皮肤的选项,所以自己做了个wp风格的输入法皮肤. 一点微小的工作 http://pan.baidu.com/s/1kVsHd ...

  6. SQL Server 解读【已分区索引的特殊指导原则】(1)- 索引对齐

    一.前言 在MSDN上看到一篇关于SQL Server 表分区的文档:已分区索引的特殊指导原则,如果你对表分区没有实战经验的话是比较难理解文档里面描述的意思.这里我就里面的一些概念进行讲解,方便大家的 ...

  7. Windows phone 全景视图

    Windows phone 全景视图下为了实现可以上下滑动需要使用listbox. 需要的布局什么的,在listbox中填写 <ListBox Name="ListBox_new&qu ...

  8. javascript运动系列第三篇——曲线运动

    × 目录 [1]圆周运动[2]三维圆周 [3]钟摆运动 [4]抛物线[5]流体运动 前面的话 上一篇介绍了变速运动,但只实现了直线运动.如果元素的left和top同时运动,并遵循不同的曲线公式,则会进 ...

  9. Android之计算缓存大小并且清空缓存

    转载博客:http://www.2cto.com/kf/201503/385492.html 项目中碰到了计算缓存大小和清空缓存的功能,这个很常见的功能,几乎每个APP都有,以为实现很简单,网上搜了一 ...

  10. 【开源】OSharp框架解说系列(1):总体设计及系列导航

    系列文章导航 [开源]OSharp框架解说系列(1):总体设计 [开源]OSharp框架解说系列(2.1):EasyUI的后台界面搭建及极致重构 [开源]OSharp框架解说系列(2.2):EasyU ...