javascript技术难点之this、new、apply和call详解

广告位招租
扫码页面底部二维码联系

this、new、call和apply【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net的相关问题

【转载请注明来源】【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】原创内容,盗版必究。

讲解this指针的原理是个很复杂的问题,【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。如果我们从javascript里this本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。的实现机制来说明this,很多朋友可能会未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net越来越糊涂,因此本篇打算换一个思路从应用【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net的角度来讲解this指针,从这个角度理解转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】this指针更加有现实意义。

转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】【作者:唐霜】【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】

下面我们看看在java语言里是如何使用t【作者:唐霜】【访问 www.tangshuang.net 获取更多精彩内容】his指针的,代码如下:

【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net
public class Person {
  private String name;
  private String sex;
  private int age;
  private String job;
  public Person(String name, String sex, int age, String job) {
    super();
    this.name = name;
    this.sex = sex;
    this.age = age;
    this.job = job;
  }
  private void showPerson() {
    System.out.println("姓名:" + this.name);
    System.out.println("性别:" + this.sex);
    System.out.println("年龄:" + this.age);
    System.out.println("工作:" + this.job);
  }
  public void printInfo() {
    this.showPerson();
  }
  public static void main(String[] args) {
    Person person = new Person("马云", "男", 46, "董事长");
    person.printInfo();
  }
}

//姓名:马云
//性别:男
//年龄:46
//工作:董事长

上面的代码执行后没有任何问题,下面我修改转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。下这个代码,加一个静态的方法,静态方法里著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】使用this指针调用类里的属性,如下图所【本文受版权保护】著作权归作者所有,禁止商业用途转载。示:

【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】

【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。

我们发现IDE会报出语法错误“Canno未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】t use this in a stat本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。ic context”,this指针在j本文作者:唐霜,转载请注明出处。【本文受版权保护】ava语言里是不能使用在静态的上下文里的转载请注明出处:www.tangshuang.net【转载请注明来源】

【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net

在面向对象编程里有两个重要的概念:本文作者:唐霜,转载请注明出处。一个是类,一个是实例化的对象【关注微信公众号:wwwtangshuangnet】, 类是一个抽象的概念,用个形象的比喻表本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。述的话,类就像一个模具,而实例化对象就是【版权所有,侵权必究】【版权所有,侵权必究】通过这个模具制造出来的产品,实例化对象才【访问 www.tangshuang.net 获取更多精彩内容】【关注微信公众号:wwwtangshuangnet】是我们需要的实实在在的东西, 类和实例化转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。对象有着很密切的关系,但是在使用上类的功【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。能是绝对不能取代实例化对象,就像模具和模【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】具制造的产品的关系,二者的用途是不相同的本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。

【原创不易,请尊重版权】【本文首发于唐霜的博客】【关注微信公众号:wwwtangshuangnet】

有上面代码我们可以看到,【作者:唐霜】this本文作者:唐霜,转载请注明出处。指针在java原创内容,盗版必究。语言里只能在实例化对象里使用,this转载请注明出处:www.tangshuang.net指针等于这个被实例化好的对象【未经授权禁止转载】,而this后面加上点操作符,点操作符后【本文首发于唐霜的博客】【本文受版权保护】面的东西就是this所拥有的东西,例如:【作者:唐霜】转载请注明出处:www.tangshuang.net姓名,工作,手,脚等等。

【版权所有,侵权必究】转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net【未经授权禁止转载】【作者:唐霜】

其实【本文受版权保护】javascript原创内容,盗版必究。里的this未经授权,禁止复制转载。指针逻辑上的概念也是实例化对象本文版权归作者所有,未经授权不得转载。,这一点和java语言里的this指针是未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。一致的,但是javascript里的th本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】is指针却比java里的this难以理解本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】的多,究其根本原因我个人觉得有三个原因:

【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。

  原因一:javascript【原创内容,转载请注明出处】是一个函数编程语言,怪就怪在它也有thi【原创内容,转载请注明出处】【未经授权禁止转载】s指针,说明这个函数编程语言也是面向对象的本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】语言,说的具体点,javascript里的函数是一个高阶函数,编程语言里的高阶【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.net函数是可以作为对象传递的,同时javas原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】cript里的函数还有可以作为构造函数,这个构造函未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】数可以创建实例化对象,结果导致方法执行时本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net候this指针的指向会不断发生变化,很难控制。【原创不易,请尊重版权】

本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】未经授权,禁止复制转载。

  原因二:javascript原创内容,盗版必究。里的全局作用域对this【访问 www.tangshuang.net 获取更多精彩内容】指针有很大的影响,由上面java【访问 www.tangshuang.net 获取更多精彩内容】的例子我们看到,this本文版权归作者所有,未经授权不得转载。指针只有在使用new【版权所有,侵权必究】操作符后才会生效,但是javascrip【原创不易,请尊重版权】未经授权,禁止复制转载。t里的this【本文受版权保护】在没有进行new【版权所有】唐霜 www.tangshuang.net操作也会生效,这时候this【版权所有】唐霜 www.tangshuang.net往往会指向全局对象window未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。

【本文受版权保护】【本文首发于唐霜的博客】未经授权,禁止复制转载。【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net

  原因三:javascript【本文受版权保护】里call本文版权归作者所有,未经授权不得转载。和apply【原创不易,请尊重版权】操作符可以随意改变this【原创内容,转载请注明出处】指向,这看起来很灵活,但是这种不合常理的转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net做法破坏了我们理解this指针的本意,同时也让写代码时候很难理解t未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。his的真正指向未经授权,禁止复制转载。

【原创不易,请尊重版权】未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net【版权所有,侵权必究】【转载请注明来源】

上面的三 个原因都违反了传统this指针【未经授权禁止转载】【关注微信公众号:wwwtangshuangnet】使用的方法,它们都拥有有别于传统this【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】原理的理解思路,而在实际开发里三个原因又原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net往往会交织在一起,这就更加让人迷惑 不解【原创内容,转载请注明出处】【转载请注明来源】了,今天我要为大家理清这个思路,其实ja本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.netvascript里的this指针有一套固【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】有的逻辑,我们理解好这套逻辑就能准确的掌本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。握好this指针的使 用。

【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。

我们先看看下面的代码:【版权所有,侵权必究】

【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】【本文首发于唐霜的博客】【版权所有,侵权必究】
复制代码
<script type="text/javascript">
  this.a = "aaa";
  console.log(a);//aaa
  console.log(this.a);//aaa
  console.log(window.a);//aaa
  console.log(this);// window
  console.log(window);// window
  console.log(this == window);// true
  console.log(this === window);// true
</script>

在script标签里我们可以直接使用th【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。is指针,this指针就是window对【本文首发于唐霜的博客】【原创内容,转载请注明出处】象,我们看到即使使用三等号它们也是相等的著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】。全局作用域常常会干扰我们很好的理解ja【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】vascript语言的特性,这种干扰的本【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。质就是:

【作者:唐霜】本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】

在javascript【作者:唐霜】语言里全局作用域可以理解为window原创内容,盗版必究。对象,记住window【版权所有】唐霜 www.tangshuang.net是对象而不是类,也就是说window【未经授权禁止转载】是被实例化的对象,这个实例化的过程是在页【版权所有,侵权必究】原创内容,盗版必究。面加载时候由javascript引擎完成的,整个页面里的要素都被浓缩到这转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。个window对象,因为程序员无法通过编程语言来控制和【作者:唐霜】未经授权,禁止复制转载。操作这个实例化过程,所以开发时候我们就没【转载请注明来源】本文版权归作者所有,未经授权不得转载。有构建这个this指针的感觉,常常会忽视它,这就是干扰我们本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】在代码里理解this指针指向window原创内容,盗版必究。的情形。【本文受版权保护】

【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】本文作者:唐霜,转载请注明出处。

干扰的本质还和function的使用有关转载请注明出处:www.tangshuang.net【本文受版权保护】,我们看看下面的代码:

【原创不易,请尊重版权】【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】
<script type="text/javascript">
  function ftn01(){
    console.log("I am ftn01!");
  }
  var ftn02 = function(){
    console.log("I am ftn02!");
  }
</script>
复制代码

 【原创内容,转载请注明出处】

【本文受版权保护】本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。

上面是我们经常使用的未经授权,禁止复制转载。两种定义函数的方式,第一种定义函数的方式未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。javascript本文版权归作者所有,未经授权不得转载。语言称作声明函数,第二种定义函数的方式叫【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。做函数表达式,这两种方式我们通常认为是等价的,但是它【作者:唐霜】【本文首发于唐霜的博客】们其实是有区别的,而这个区别常常会让我们著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。混淆this指针的使用,我们再看看下面的本文版权归作者所有,未经授权不得转载。【本文受版权保护】代码:

转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】【本文首发于唐霜的博客】【转载请注明来源】
复制代码
<script type="text/javascript">
  console.log(ftn01);//ftn01() 注意:在firebug下这个打印结果是可以点击,点击后会显示函数的定义
  console.log(ftn02);// undefined
  function ftn01(){
    console.log("I am ftn01!");
  }
  var ftn02 = function(){
    console.log("I am ftn02!");
  }
</script>

这又是一 段没有按顺序执行的代码,先看看【本文受版权保护】未经授权,禁止复制转载。ftn02,打印结果是undefined【版权所有,侵权必究】【原创内容,转载请注明出处】,undefined我在前文里讲到了,在本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】内存的栈区已经有了变量的名称,但是 没有【版权所有,侵权必究】【未经授权禁止转载】栈区的变量值,同时堆区是没有具体的对象,【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。这是javascript引擎在预处理(群【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】里东方说预处理比预加载更准确,我同意他的本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】说法,以后文章里我都 写为预处理)扫描变本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】量定义所致,但是ftn01的打印结果很令本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】人意外,既然打印出完成的函数定义了,而且著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】代码并没有按顺序执行,这只能说明一个问题转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】

【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】未经授权,禁止复制转载。

在javascript【版权所有】唐霜 www.tangshuang.net语言通过声明函数方式定义函数,javas【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。cript引擎在预处理过程里就把函数定义和赋值操作【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】都完成了,在这里我补充下javascri【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。pt里 预处理的特性,其实预处理是和执行环境【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。相关,在上篇文章里我讲到执行环境有两大类【关注微信公众号:wwwtangshuangnet】【原创不易,请尊重版权】:全局执行环境和局部执行环境,执行环境是【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。通过上下文变量体现的,其实这 个过程都是【本文受版权保护】【原创内容,转载请注明出处】在函数执行前完成,预处理就是构造执行环境【版权所有,侵权必究】【访问 www.tangshuang.net 获取更多精彩内容】的另一个说法,总而言之预处理和构造执行环【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。境的主要目的就是明确变量定义,分清变量的原创内容,盗版必究。【版权所有,侵权必究】边界,但是在全 局作用域构造或者说全局变【未经授权禁止转载】【本文受版权保护】量预处理时候对于声明函数有些不同,声明函著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】数会将变量定义和赋值操作同时完成,因此我未经授权,禁止复制转载。【原创不易,请尊重版权】们看到上面代码的运行结果。由于声明函数都原创内容,盗版必究。未经授权,禁止复制转载。 会在全局作用域构造时候完成,因此声明函【版权所有】唐霜 www.tangshuang.net【转载请注明来源】数都是window对象的属性,这就说明为什么我们不管在哪里本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。声明函数,声明函数最终都是属于windo本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.netw对象的原因了本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。

原创内容,盗版必究。未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】

关于函数表达式的写法还有秘密可以探寻,我转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。们看下面的代码:

未经授权,禁止复制转载。未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net
<script type="text/javascript">
  function ftn03(){
    var ftn04 = function(){
      console.log(this);// window
    };
    ftn04();
  }
  ftn03();
</script>

运行结果 我们发现ftn04虽然在ftn未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】03作用域下,但是执行它里面的this指本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。针也是指向window,其实函数表达式的【转载请注明来源】【未经授权禁止转载】写法我们大多数更喜欢在函数内部写, 因为【未经授权禁止转载】本文作者:唐霜,转载请注明出处。声明函数里的this指向window这已【转载请注明来源】本文版权归作者所有,未经授权不得转载。经不是秘密,但是函数表达式的this指针【版权所有,侵权必究】转载请注明出处:www.tangshuang.net指向window却是常常被我们所忽视,特著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】别是当它被写在另一个 函数内部时候更加如本文版权归作者所有,未经授权不得转载。【作者:唐霜】此。

【本文受版权保护】【本文首发于唐霜的博客】【本文首发于唐霜的博客】

其实在javascript原创内容,盗版必究。语言里任何匿名函数都是属于window【访问 www.tangshuang.net 获取更多精彩内容】对 象,它们也都是在全局作用域构造时候完本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】成定义和赋值,但是匿名函数是没有名字的函本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】数变量,但是在定义匿名函数时候它会返回自著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】己的内存地址,如果此时有个变 量接收了这【作者:唐霜】本文作者:唐霜,转载请注明出处。个内存地址,那么匿名函数就能在程序里被使本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】用了,因为匿名函数也是在全局执行环境构造著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。时候定义和赋值,所以匿名函数的this指向也是window【原创内容,转载请注明出处】对象,所以上面代码执行时候ftn04未经授权,禁止复制转载。的this【访问 www.tangshuang.net 获取更多精彩内容】也是指向window【版权所有,侵权必究】,因为javascript【访问 www.tangshuang.net 获取更多精彩内容】变量名称不管在那个作用域有效,堆区的存储【本文首发于唐霜的博客】【本文受版权保护】的函数都是在全局执行环境时候就被固定下来【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。了,变量的名字只是一个指代而已。

本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。

这下子坏了,this都指向window,原创内容,盗版必究。【未经授权禁止转载】那我们到底怎么才能改变它了?

【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net【版权所有,侵权必究】【本文首发于唐霜的博客】

在本文开头我说出了this的秘密,【访问 www.tangshuang.net 获取更多精彩内容】this【关注微信公众号:wwwtangshuangnet】都是指向实例化对象著作权归作者所有,禁止商业用途转载。, 前面讲到那么多情况this都指向wi本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】ndow,就是因为这些时候只做了一次实例【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】化操作,而这个实例化都是在实例化wind【原创内容,转载请注明出处】未经授权,禁止复制转载。ow对象,所以this都是指 向wind未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。ow。我们要把this从window变成未经授权,禁止复制转载。【本文受版权保护】别的对象,就得要让function被实例原创内容,盗版必究。【本文首发于唐霜的博客】化,那如何让javascript的fun【本文首发于唐霜的博客】【转载请注明来源】ction实例 化呢?答案就是使用new著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】操作符。我们看看下面的代码:

未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。未经授权,禁止复制转载。
<script type="text/javascript">
  var obj = {
    name:"sharpxiajun",
    job:"Software",
    show:function(){
      console.log("Name:" + this.name + ";Job:" + this.job);
      console.log(this);// Object { name="sharpxiajun", job="Software", show=function()}
    }
  };
  var otherObj = new Object();
  otherObj.name = "xtq";
  otherObj.job = "good";
  otherObj.show = function(){
    console.log("Name:" + this.name + ";Job:" + this.job);
    console.log(this);// Object { name="xtq", job="good", show=function()}
  };
  obj.show();//Name:sharpxiajun;Job:Software
  otherObj.show();//Name:xtq;Job:good
</script>

这 是我上篇讲到的关于this使用的一个转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】例子,写法一是我们大伙都爱写的一种写法,【原创不易,请尊重版权】未经授权,禁止复制转载。里面的this指针不是指向window的原创内容,盗版必究。【未经授权禁止转载】,而是指向Object的实 例,fire【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。bug的显示让很多人疑惑,其实Objec本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。t就是面向对象的类,大括号里就是实例对象本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net了,即obj和otherObj。Java【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】script 里通过字面量方式定义对象的【转载请注明来源】【版权所有,侵权必究】方式是new Object的简写,二者是【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net等价的,目的是为了减少代码的书写量,可见【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。即使不用new操作字面量定义法本质也是n【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。ew操作符,所以通过new改变this 【原创不易,请尊重版权】未经授权,禁止复制转载。指针的确是不过攻破的真理。

本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net

下面我使用javascript来重写本篇【本文受版权保护】【原创内容,转载请注明出处】开头用java定义的类,代码如下:

未经授权,禁止复制转载。原创内容,盗版必究。转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】
<script type="text/javascript">
  function Person(name,sex,age,job){
    this.name = name;
    this.sex = sex;
    this.age = age;
    this.job = job;
    this.showPerson = function(){
      console.log("姓名:" + this.name);
      console.log("性别:" + this.sex);
      console.log("年龄:" + this.age);
      console.log("工作:" + this.job);
      console.log(this);// Person { name="马云", sex="男", age=46, 更多...}
    }
  }

  var person = new Person("马云", "男", 46, "董事长");
  person.showPerson();
</script>

看this指针的打印,类变成了Perso未经授权,禁止复制转载。【未经授权禁止转载】n,这表明function Person本文版权归作者所有,未经授权不得转载。【本文受版权保护】就是相当于在定义一个类,在javascr【本文受版权保护】【原创内容,转载请注明出处】ipt里function的意义实在太多,function著作权归作者所有,禁止商业用途转载。既是函数又可以表示对象,function是函数时候还能当做构造函数,javasc著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。ript的构造函数我常认为是把类和构造函数合二为【作者:唐霜】【访问 www.tangshuang.net 获取更多精彩内容】一,当然在javascript语言规范里是没有类的概念,但是我这种理解著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net可以作为构造函数和普通函数的一个区别,这著作权归作者所有,禁止商业用途转载。【本文受版权保护】样理解起来会更加容易些【关注微信公众号:wwwtangshuangnet】

原创内容,盗版必究。本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】

下面我贴出在《javascript高级编【转载请注明来源】著作权归作者所有,禁止商业用途转载。程》里对new操作符的解释:

转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】原创内容,盗版必究。【作者:唐霜】

  new未经授权,禁止复制转载。操作符会让构造函数产生如下变化:本文版权归作者所有,未经授权不得转载。

【原创不易,请尊重版权】【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】

  未经授权,禁止复制转载。1. 【转载请注明来源】创建一个新对象;著作权归作者所有,禁止商业用途转载。

【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】未经授权,禁止复制转载。

  著作权归作者所有,禁止商业用途转载。2. 原创内容,盗版必究。将构造函数的作用域赋给新对象(因此thi【转载请注明来源】【原创内容,转载请注明出处】s就指向了这个新对象);原创内容,盗版必究。

原创内容,盗版必究。【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net

  【关注微信公众号:wwwtangshuangnet】3. 【原创不易,请尊重版权】执行构造函数中的代码(为这个新对象添加属【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。性);

【本文首发于唐霜的博客】【原创不易,请尊重版权】【未经授权禁止转载】

  原创内容,盗版必究。4. 【未经授权禁止转载】返回新对象本文版权归作者所有,未经授权不得转载。

本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】

关于第二 点其实很容易让人迷惑,例如前面本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】例子里的obj和otherObj,obj本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】.show(),里面this指向obj,【原创内容,转载请注明出处】【本文首发于唐霜的博客】我以前文章讲到一个简单识别this 方式【版权所有,侵权必究】【本文受版权保护】就是看方法调用前的对象是哪个this就指著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】向哪个,其实这个过程还可以这么理解,在全【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。局执行环境里window就是上下文对象,本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】那么在obj里局部作 用域通过obj来代未经授权,禁止复制转载。未经授权,禁止复制转载。表了,这个window的理解是一致的。

著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】【本文受版权保护】

第四点也要着重讲下,记住构造函数被new未经授权,禁止复制转载。【作者:唐霜】操作,要让new正常作用最好不能在构造函原创内容,盗版必究。【本文首发于唐霜的博客】数里写return,没有return的构本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。造函数都是按上面四点执行,有了retur本文作者:唐霜,转载请注明出处。【未经授权禁止转载】n情况就复杂了,这个知识我会在讲prot【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】otype时候讲到。

【原创不易,请尊重版权】未经授权,禁止复制转载。原创内容,盗版必究。【原创不易,请尊重版权】

Javascript还有一种方式可以改变【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。this指针,这就是call方法和app【作者:唐霜】著作权归作者所有,禁止商业用途转载。ly方法,call和apply方法的作用转载请注明出处:www.tangshuang.net【未经授权禁止转载】相同,就是参数不 同,call和appl【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】y的第一个参数都是一样的,但是后面参数不转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。同,apply第二个参数是个数组,cal原创内容,盗版必究。【转载请注明来源】l从第二个参数开始后面有许多参数。Cal【关注微信公众号:wwwtangshuangnet】原创内容,盗版必究。l 和apply的作用是什么,这个很重要本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】,重点描述如下:

【本文受版权保护】转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。

  Call【本文首发于唐霜的博客】和apply转载请注明出处:www.tangshuang.net是改变函数的作用域(有些书里叫做改变函数著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】的上下文)

【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】【原创内容,转载请注明出处】未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】

这个说明我们参见上面new操作符第二条:

【版权所有,侵权必究】转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】【版权所有,侵权必究】

  将构造函数的作用域赋给新对象(因此t【原创内容,转载请注明出处】未经授权,禁止复制转载。his就指向了这个新对象);【访问 www.tangshuang.net 获取更多精彩内容】

原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】【原创不易,请尊重版权】【版权所有,侵权必究】

  Call【版权所有,侵权必究】和apply【原创内容,转载请注明出处】是将this【作者:唐霜】指针指向方法的第一个参数。本文版权归作者所有,未经授权不得转载。

未经授权,禁止复制转载。【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】

我们看看下面的代码:本文版权归作者所有,未经授权不得转载。

【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net
<script type="text/javascript">
  var name = "sharpxiajun";
  function ftn(name){
    console.log(name);
    console.log(this.name);
    console.log(this);
  }
  ftn("101");
  var obj = {
    name:"xtq"
  };
  ftn.call(obj,"102");
</script>

我们看到apply和call改变的是th转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.netis的指向,这点在开发里很重要,开发里我【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。们常常被this所迷惑,迷惑的根本原因我【转载请注明来源】本文作者:唐霜,转载请注明出处。在上文讲到了,这里我讲讲表面的原因:

【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】【转载请注明来源】

  表面原因就是我们定义对象使用对象的字【原创不易,请尊重版权】【访问 www.tangshuang.net 获取更多精彩内容】面表示法,字面表示法在简单的表示里我们很【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】容易知道this指向对象本身,但是这个对象会有方法,方法【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】的参数可能会是函数,而这个函数的定义里也【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】可能会使用this指针,如果传入的函数没有被实例化过和被实【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net例化过,this的指向是不同,有时我们还想在传入函数里通【本文受版权保护】【版权所有】唐霜 www.tangshuang.net过this指向外部函数或者指向被定义对象本身,这些【本文首发于唐霜的博客】【版权所有,侵权必究】乱七八糟的情况使用交织在一起导致this变得很复杂,结果就变得糊里糊涂。未经授权,禁止复制转载。

【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net

其实理清上面情况也是有迹可循的,就以定义【转载请注明来源】转载请注明出处:www.tangshuang.net对象里的方法里传入函数为例:

【本文首发于唐霜的博客】【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】

  情形一:传入的参数是函数的别名,那么【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net函数的this就是指向window【本文受版权保护】【作者:唐霜】

本文作者:唐霜,转载请注明出处。【作者:唐霜】本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net【作者:唐霜】

  情形二:传入的参数是被new【原创不易,请尊重版权】过的构造函数,那么this未经授权,禁止复制转载。就是指向实例化的对象本身;【关注微信公众号:wwwtangshuangnet】

未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】【未经授权禁止转载】

  情形三:如果我们想把被传入的函数对象【本文首发于唐霜的博客】【原创不易,请尊重版权】里this的指针指向外部字面量定义的对象,那么我们转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】就是用apply和call【转载请注明来源】

【版权所有】唐霜 www.tangshuang.net【作者:唐霜】转载请注明出处:www.tangshuang.net

我们可以通过代码看出我的结论,代码如下:

【未经授权禁止转载】【转载请注明来源】未经授权,禁止复制转载。
<script type="text/javascript">
var name = "I am window";
var obj = {
  name:"sharpxiajun",
  job:"Software",
  ftn01:function(obj){
    obj.show();
  },
  ftn02:function(ftn){
    ftn();
  },
  ftn03:function(ftn){
    ftn.call(this);
  }
};
function Person(name){
  this.name = name;
  this.show = function(){
    console.log("姓名:" + this.name);
    console.log(this);
  }
}
var p = new Person("Person");
obj.ftn01(p);
obj.ftn02(function(){
  console.log(this.name);
  console.log(this);
});
obj.ftn03(function(){
  console.log(this.name);
  console.log(this);
});
</script>
复制代码

结果如下:【转载请注明来源】

【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】

【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】【转载请注明来源】【转载请注明来源】

最后再总结一下:本文作者:唐霜,转载请注明出处。

原创内容,盗版必究。【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】【访问 www.tangshuang.net 获取更多精彩内容】

  如果在javascript【原创内容,转载请注明出处】语言里没有通过new【转载请注明来源】(包括对象字面量定义)、call转载请注明出处:www.tangshuang.net和apply【本文首发于唐霜的博客】改变函数的this【版权所有,侵权必究】指针,函数的this【版权所有,侵权必究】指针都是指向window【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】

【未经授权禁止转载】【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net

原文地址:http://www.cnbl【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。ogs.com/sharpxiajun/本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。p/4148932.html

【未经授权禁止转载】【原创内容,转载请注明出处】【原创不易,请尊重版权】

2016-01-20 3846

为价值买单,打赏一杯咖啡

本文价值38.46RMB