上下文: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. String驻留带来的危害

    原创文章转载请注明出处:@协思, http://zeeman.cnblogs.com   前段时间接手了一个项目优化工作,在同等场景下内存使用从4G降低到200M.   项目是将实体序列化成字符串存入 ...

  2. 图解C#的值类型,引用类型,栈,堆,ref,out

    C# 的类型系统可分为两种类型,一是值类型,一是引用类型,这个每个C#程序员都了解.还有托管堆,栈,ref,out等等概念也是每个C#程序员都会接触到的概念,也是C#程序员面试经常考到的知识,随便搜搜 ...

  3. Spring注入JPA+JPA事务管理

    本例实现的是Spring注入JPA 和 使用JPA事务管理.JPA是sun公司开发的一项新的规范标准.在本质上来说,JPA可以看作是Hibernate的一个子集:然而从功能上来说,Hibernate是 ...

  4. Entity Framework Code First实体关联数据加载

    在项目过程中,两个实体数据之间在往往并非完全独立的,而是存在一定的关联关系,如一对一.一对多及多对多等关联.存在关联关系的实体,经常根据一个实体的实例来查询获取与之关联的另外实体的实例. Entity ...

  5. 实战MEF(1):一种不错的扩展方式

    在过去,我们完成一套应用程序后,如果后面对其功能进行了扩展或修整,往往需要重新编译代码生成新的应用程序,然后再覆盖原来的程序.这样的扩展方式对于较小的或者不经常扩展和更新的应用程序来说是可以接受的,而 ...

  6. Matlab 循环读入和输出

    这两天要给导师做实验,因此要写Matlab程序,在做程序的时候,涉及到了循环读入和输出,查找相关资料 代码如下 : Image=['F:\\SYTP\\',num2str(i),'.jpg']; Te ...

  7. 【原创】开源Math.NET基础数学类库使用(05)C#解析Delimited Formats数据格式

                   本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新  开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...

  8. 前端编码风格规范之 HTML 规范

    HTML 规范 文档类型 推荐使用 HTML5 的文档类型申明: <!DOCTYPE html>. (建议使用 text/html 格式的 HTML.避免使用 XHTML.XHTML 以及 ...

  9. CSS字体记录

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAaYAAACnCAIAAADVOG9FAAAgAElEQVR4nOy9eXwcxZk/vL/9ve8eb7 ...

  10. Oracle数据库全球化

    一.自定义数据库和各个会话的语言相关行为 1.1 全球化功能 1.2 使用全球化支持功能 二.使用数据库和NLS字符集 2.1 语言排序与选择 2.2 Locale Builder 2.3 使用时区 ...