javascript中的function(){}(), new function(), new Function(), Function以及它们中的this

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

和java比起来,javascript真【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net的是松散的无以复加,不过这也让我们在无聊本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】之余,有精力去探讨一些复杂的应用,从而在未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。开发之路上,获得一些新的想法。

【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】

javascript中的类的构造未经授权,禁止复制转载。

原创内容,盗版必究。本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。

javascript中有对象的概念,却没本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net有类的概念。对于基础不牢的同学,很难在类【未经授权禁止转载】本文作者:唐霜,转载请注明出处。和对象之间加以区分,这里简单的将它们的关【版权所有】唐霜 www.tangshuang.net【作者:唐霜】系概况为:类是一种抽象的概念,例如瓶子、转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。人、笨蛋;而对象,则是指这种概念中的实体著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net,比如“那个美女手中的那只瓶子”“村长是【原创内容,转载请注明出处】原创内容,盗版必究。一个地道的农民”“她的男朋友是个笨蛋”;著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】实例化,就是指以类为基础构建一个实体。类【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】所拥有的特征,其实例化对象,也一定拥有这【作者:唐霜】【本文首发于唐霜的博客】些特征,而且实例化后可能拥有更多特征。

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

javascript在用到对象时,完全没【本文受版权保护】【未经授权禁止转载】有类的概念,但是编程的世界里,无奇不有,原创内容,盗版必究。【原创不易,请尊重版权】我们却可以通过function构造出一种本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】假想的类,从而实现javascript中原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】类的构造。

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

比如,我们通过下面的方法来构造一个类:【访问 www.tangshuang.net 获取更多精彩内容】

【版权所有,侵权必究】未经授权,禁止复制转载。未经授权,禁止复制转载。【本文受版权保护】未经授权,禁止复制转载。
//java
class Book {
  private String name;
  private double price;
  public Book(name,price) {
    this.name=name;this.price=price;
  }
  public void setName(String name) {
    this.name = name;
  }
  public void setPrice(double price) {
    this.price = price;
  }
  public String getInfo() {...}
}
Book book1 = new Book('java',13.3);

//javascript
function Book(name,price) {
    this.name = name;
    this.price = price;
    this.setName = function(name) {this.name = name;};
    this.setPrice = function(price) {this.price = price};
    this.getInfo = function() {return this.name + '' + this.price;};
}
var book1 = new Book('java',13.3);

这是很好玩儿的一种尝试。这也是本文要讨论【未经授权禁止转载】【本文受版权保护】的所有问题的起源。

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

function(){}()让变量快速初【转载请注明来源】转载请注明出处:www.tangshuang.net始化结果

【转载请注明来源】【本文首发于唐霜的博客】【版权所有,侵权必究】

在《转载请注明出处:www.tangshuang.netjavascript立即执行某个函数:插【作者:唐霜】未经授权,禁止复制转载。件中function(){}()再思考》一文中,我详细阐述了function(【转载请注明来源】未经授权,禁止复制转载。){}()的作用及理解思路。这里不再赘述本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】,现在,我们面临的新问题是,知道了它的作【原创不易,请尊重版权】【原创内容,转载请注明出处】用,我们如何使用它?

本文版权归作者所有,未经授权不得转载。【转载请注明来源】【原创不易,请尊重版权】

让我们来看一段代码:【未经授权禁止转载】

【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】
var timestamp = function(){
  var timestamp = Date.parse(new Date());
  return timestamp/1000;
}();

当我们要使用一个变量时,我们希望这个变量【原创内容,转载请注明出处】【本文受版权保护】在一个环节完成我们的赋值,使用上面的这种【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。方法,可以减少代码上下文执行逻辑,如果按原创内容,盗版必究。本文作者:唐霜,转载请注明出处。照我们以前的方法,代码可能会写成:

【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net【本文受版权保护】【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net
var timestamp = Date.parse(new Data());
timestamp = timestamp/1000;

看上去好像比上面的操作简洁多了,只需要两转载请注明出处:www.tangshuang.net【作者:唐霜】行代码。但是我们仔细去观察,就会发现第一著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】段代码其实本身仅是一个赋值操作,在fun【转载请注明来源】【本文受版权保护】ction中完成的所有动作将会在func【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.nettion执行完后全部释放,整个代码看上去著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】好像只执行了一条语句一样。

原创内容,盗版必究。原创内容,盗版必究。原创内容,盗版必究。

而实际上更重要的意义在于它可以让一个变量【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。在初始化时,就具备了运算结果的效果。

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

使用new function初始化一个可【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】操作对象

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

第一部分讲到了javascript中的类【本文受版权保护】原创内容,盗版必究。,而使用new function就可以实本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】例化这个类。但是我们实际上有的时候在为一著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】个变量赋值的时候,希望直接将它初始化为一转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。个可操作的对象,比如像这样:

本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net【版权所有,侵权必究】【本文受版权保护】
// 这里的数据库操作是我虚拟出来的一种数据库操作形式
var $db = new function(){
  var $db = db_connect('127.0.0.1','root','');
  $db.use('database');
  this.select = function(table,where) {
    var result = $db.query('select from ' + table + ' where ' + where);
    return $db.fetchAll(result);
  }
};

而当我们要对数据库database进行查【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】询时,只需要通过var list = $db.select('table','1=1');进行操作即可,数据库的初始化结果已经在$未经授权,禁止复制转载。【版权所有,侵权必究】db这个变量中了。

【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】【关注微信公众号:wwwtangshuangnet】

Function是由function关键【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.net字定义的函数对象的原型

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

在javascript中,多出了一个原型【关注微信公众号:wwwtangshuangnet】【转载请注明来源】的概念。所谓原型,其实就是一个对象的本质未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。,但复杂就复杂在,原型本身也是对象,因此【原创内容,转载请注明出处】【版权所有,侵权必究】,任何一个对象又可以作为其他对象的原型。【版权所有,侵权必究】【作者:唐霜】Function就相当于一个系统原型,可转载请注明出处:www.tangshuang.net【本文受版权保护】以把它理解为一种“基本对象类型”,是“对转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。象”这个概念范畴类的基本数据类型。除了F【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】unction之外,其实还有很多类似的首【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。字母大写的对象原型,例如Object, 【原创内容,转载请注明出处】【本文受版权保护】Array, Image等等。有一种说法【版权所有,侵权必究】【未经授权禁止转载】是:javascript中所有的一切都是本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】对象(除了基本数据类型,其他的一切全是对【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。象),所有的对象都是Object衍生出来【作者:唐霜】【未经授权禁止转载】的。(按照这种说法,我们应该返回去再思考【未经授权禁止转载】【转载请注明来源】,上面说的类的假设是否成立。)

【转载请注明来源】【原创不易,请尊重版权】【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。

因此,当我们想要构建一个类的时候,实际上本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】也是在构建一个原型。一旦一个原型类构建成【作者:唐霜】转载请注明出处:www.tangshuang.net功,就会对他进行实例化。

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

极其重要的prototype概念【未经授权禁止转载】

【作者:唐霜】本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。

prototype的概念在javascr【作者:唐霜】【本文首发于唐霜的博客】ipt中极其重要,它是javascrip转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.nett中完成上面说的“一切皆对象”的关键。有【本文受版权保护】【版权所有】唐霜 www.tangshuang.net了prototype,才有了原型,有了原【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net型,才有了javascript五彩缤纷的原创内容,盗版必究。【本文首发于唐霜的博客】世界(当然,也有人说是杂乱的)。我们可以原创内容,盗版必究。未经授权,禁止复制转载。这样去理解prototype:世界上本没原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】有javascript,上帝说要有Obj原创内容,盗版必究。【转载请注明来源】ect,于是有了Object,可是要有F【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】unction怎么办?只需要对Objec本文版权归作者所有,未经授权不得转载。【转载请注明来源】t进行扩展,可是如何扩展?只需要用pro转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。totype……当然,这是乱扯的,不过在【原创内容,转载请注明出处】【未经授权禁止转载】javascript中,只要是funct本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】ion,就一定会有一个prototype本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net属性。实际上确实是这样

原创内容,盗版必究。【版权所有,侵权必究】【未经授权禁止转载】
Function.prototype.show = function() {...}

在原型的基础上通过prototype新增【转载请注明来源】本文版权归作者所有,未经授权不得转载。属性或方法,则以该对象为原型的实例化对象本文作者:唐霜,转载请注明出处。【未经授权禁止转载】中,必然存在新增的属性或方法,而且它的内【版权所有,侵权必究】转载请注明出处:www.tangshuang.net容是静态不可重载的。原型之所以被称为原型【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。,可能正是因为这种不可重载的特质。

【版权所有】唐霜 www.tangshuang.net【转载请注明来源】原创内容,盗版必究。【版权所有,侵权必究】

比如上面的这段代码,会导致每一个实例化的【转载请注明来源】【未经授权禁止转载】function,都会具备一个show方著作权归作者所有,禁止商业用途转载。【本文受版权保护】法。而如果我们自己创建了一个类,则可以通【本文受版权保护】【原创不易,请尊重版权】过prototype将之转化为原型:

【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】原创内容,盗版必究。本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】
function Cat() {...}
Cat.prototype.run = function() {};
var cat1 = new Cat();

这时,对于cat1而言,Cat就是原型,【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。而该原型拥有一个run的原始方法,所以无原创内容,盗版必究。本文作者:唐霜,转载请注明出处。论实例化多少个Cat,每一个实例化对象都著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net有run方法,而且该方法是不能被重载的,【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net通过cat1.run = function(){}是无效的。原创内容,盗版必究。

【作者:唐霜】【原创不易,请尊重版权】【原创内容,转载请注明出处】

为了和其他语言的类的定义方法统一,我们可转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。以将这种原型属性在定义类的时候,写在类的【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。构造里面:

【本文首发于唐霜的博客】【原创内容,转载请注明出处】原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】
function Cat() {
  ....
  Cat.prototype.run = function() {};
}

new Function()是函数原型的本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。一个实例化

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

在理解了Function原型的概念之后,【本文首发于唐霜的博客】未经授权,禁止复制转载。再来看new Function()就显得本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net很容易了。首先来看下我们是怎么使用这种奇【作者:唐霜】【原创不易,请尊重版权】特的写法的:

【未经授权禁止转载】【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。【转载请注明来源】
var message = new Function('msg','alert(msg)');
// 等价于:
function message(msg) {
  alert(msg);
}

new Function(参数1,参数2本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】,…,参数n,函数体),它的【本文受版权保护】原创内容,盗版必究。本意其实是通过实例化一个Function【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。原型,得到一个数据类型为function【转载请注明来源】【本文受版权保护】的对象,也就是一个函数,而该变量就是函数【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net名。

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

this在这类function中的指向本文作者:唐霜,转载请注明出处。

【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net

this在javascript中真的是无【版权所有,侵权必究】【转载请注明来源】法让我们捉摸透彻。但是有一个小窍门,就是【关注微信公众号:wwwtangshuangnet】【原创不易,请尊重版权】:一般情况下,this指向的是当前实例化转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net对象,如果没有找到该对象,则是指向win【本文首发于唐霜的博客】未经授权,禁止复制转载。dow。从使用上来讲,我们应该排除new【原创内容,转载请注明出处】未经授权,禁止复制转载。 Function的讨论,因为它和我们常著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】用的函数声明是一致的。

原创内容,盗版必究。原创内容,盗版必究。未经授权,禁止复制转载。原创内容,盗版必究。【本文首发于唐霜的博客】

普通的函数中this的指向【本文受版权保护】

著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。未经授权,禁止复制转载。

函数声明的时候,如果使用了this,那么【本文受版权保护】【关注微信公众号:wwwtangshuangnet】就要看是把该函数当做一个对象加以返回,还【本文首发于唐霜的博客】【转载请注明来源】是以仅执行函数体。普通函数执行时,我们完【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。全没有引入对象、类这些概念,因此,thi本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。s指向window。通过代码来看下:

【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。
var msg;
function message(msg) {
  this.msg = msg;
}
message('ok');
alert(msg);

首先是声明一个函数message,在函数【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。中this.msg实际上就是window【版权所有,侵权必究】【访问 www.tangshuang.net 获取更多精彩内容】.msg,也实际上就是代码开头的msg。著作权归作者所有,禁止商业用途转载。【转载请注明来源】因此,当执行完message(̵本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。6;ok’)的时候,开头的全【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】局变量msg也被赋值为ok。

未经授权,禁止复制转载。【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】

补充:当执行函数或全局变量时,我们可以认【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.net为是在对window对象进行操作。例如上本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。面的message函数的例子,当我们执行【本文首发于唐霜的博客】【作者:唐霜】 message('ok'); 时,实际上在执行 【未经授权禁止转载】window.message('ok'); ,函数被假设为window的一个方法,本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。在这种假设下,window就是实例化对象【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。,因此,函数中的this应该指向wind【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】ow。

【作者:唐霜】转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。【本文受版权保护】原创内容,盗版必究。
【版权所有,侵权必究】【原创内容,转载请注明出处】未经授权,禁止复制转载。未经授权,禁止复制转载。

对象的方法函数中的this的指向著作权归作者所有,禁止商业用途转载。

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

没什么好说的,指向该对象。比如:【本文受版权保护】

【原创不易,请尊重版权】未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】
var object = {
  name : 'Tom',
  age: 12,
  run: function() {
    var last_time = 60 * this.age;// 这里的this指向object,因此this.age=12
  }
};

这是在常见的声明一个对象的时候出现的情况【原创内容,转载请注明出处】【未经授权禁止转载】。还有一种就是实例化一个类的时候,实例化【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】类的方法中的this也指向实例化对象:

【本文首发于唐霜的博客】【本文受版权保护】未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。
function Cat() {
  this.name = 'Tom';
  this.age = 12;
  this.run = function() {
    var last_time = 60 * this.age;// 这里的this指向new的实例化对象,因此this.age=12
  };
}
var cat1 = new Cat();

通过function构造类时this的指本文作者:唐霜,转载请注明出处。【作者:唐霜】

【转载请注明来源】著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】

如果function被构造为一个类,那么未经授权,禁止复制转载。【本文首发于唐霜的博客】必然存在该类被实例化的一个过程,如果没有【转载请注明来源】【原创不易,请尊重版权】实例化,那么该类实际上并没有在程序中被使本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。用。而一旦实例化,那么this将指向实例著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】化的对象。

未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】【本文受版权保护】【原创内容,转载请注明出处】
var age = 3;
var cat1 = new function() {
    this.name = 'Tom';
    this.age = 2;
    this.weight = function(age) {
        var age = age * 2;
        var _age = this.age * 2; // 2
        return 'weight by age:' + age + '; weight by this.age:' + _age;
    }(this.age); // 1
    this.eye = new function() {
        this.size = '1.5cm';
        this.color = 'red'; // 3
    };
    this.catching = function(mouse) {
        return this.name + ' is catching ' + mouse; // 4
    };
};
alert(cat1.weight);
alert(cat1.eye.color);
alert(cat1.catching('Jerry'));

上面代码中标记了4处红色的this的使用【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。。根据我们的原则,this指向实例化对象未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。,我们来对每一个this进行分解。

未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net【作者:唐霜】【访问 www.tangshuang.net 获取更多精彩内容】

首先是cat1.weight,我使用了f未经授权,禁止复制转载。【原创不易,请尊重版权】unction(){}(),直接利用猫咪【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。的年龄进行计算得出体重返回给weight【未经授权禁止转载】未经授权,禁止复制转载。属性。

【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。

第一个this.age出现在functi【本文首发于唐霜的博客】【原创不易,请尊重版权】on(){}(this.age),这个t【本文受版权保护】本文作者:唐霜,转载请注明出处。his.age实际上是一个传值过程,如果著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。你对我之前分析function(){}(本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。)比较了解的话,应该知道,this.ag【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。e实际上是和前面this.age = 2【原创内容,转载请注明出处】【转载请注明来源】指同一个,这里的this.age的thi【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。s,首先要去找它所在的function,【本文受版权保护】本文作者:唐霜,转载请注明出处。然后看这个function是否被实例化,【未经授权禁止转载】未经授权,禁止复制转载。最后确认,确实被实例化为cat1,因此t转载请注明出处:www.tangshuang.net【未经授权禁止转载】his=cat1。

【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。【未经授权禁止转载】

第二个this.age出现在functi转载请注明出处:www.tangshuang.net【作者:唐霜】on(){this.age}()。同样,【本文受版权保护】转载请注明出处:www.tangshuang.net你先需要对function(){}()再【版权所有,侵权必究】【本文首发于唐霜的博客】次深入了解,实际上,function()本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】{}()就是执行一个函数而已,我们前面提本文作者:唐霜,转载请注明出处。原创内容,盗版必究。到了,普通函数执行中this=windo【版权所有,侵权必究】转载请注明出处:www.tangshuang.netw,所以,这里的this.age实际上是【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。var age = 3。

【版权所有】唐霜 www.tangshuang.net【本文受版权保护】原创内容,盗版必究。【作者:唐霜】原创内容,盗版必究。

第三个this.color出现在new 【本文受版权保护】【未经授权禁止转载】function(){this.colo【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.netr},这里就比较好玩,由于有一个new,【原创内容,转载请注明出处】【原创不易,请尊重版权】实际上也被实例化了,只不过是对匿名类的实【原创不易,请尊重版权】未经授权,禁止复制转载。例化,没有类名,而且实例化仅可能出现这一未经授权,禁止复制转载。原创内容,盗版必究。次。因此,this.color的this【版权所有,侵权必究】未经授权,禁止复制转载。要去找new function的主人,也转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】就是this.eye,而this.eye原创内容,盗版必究。未经授权,禁止复制转载。的this=cat1,所以cat1.ey【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.nete.color=’red&#本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。8217;。

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

第四个this.name出现在funct未经授权,禁止复制转载。未经授权,禁止复制转载。ion(){this.name},它出现【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。在cacthing方法中,它既不是普通的著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。函数执行,也不是实例化为对象,而是正常的本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。类中的方法的声明,按照上面的规则,thi【关注微信公众号:wwwtangshuangnet】【转载请注明来源】s指向要去找它所在的function被实【转载请注明来源】本文版权归作者所有,未经授权不得转载。例化的对象,也就是cat1。

【转载请注明来源】【关注微信公众号:wwwtangshuangnet】【作者:唐霜】【关注微信公众号:wwwtangshuangnet】

call、apply和bind后this【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。的指向

【本文受版权保护】【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net

这个如果出现了call、apply和bi转载请注明出处:www.tangshuang.net原创内容,盗版必究。nd,什么都不要想,用新的对象取代老的对【作者:唐霜】原创内容,盗版必究。象,this指向新对象。比如:

【关注微信公众号:wwwtangshuangnet】【未经授权禁止转载】【作者:唐霜】
var value = 1;
var myObject = {value: 100};
var foo = function() { 
  console.log(this.value);
};
foo(); // 1,执行函数this指向window
foo.apply(myObject); // 100,实例化对象发生了转变,myObject成为当前对象,this指向myObject
foo.call(myObject); // 100,同上 

var newFoo = foo.bind(myObject);
newFoo(); // 100,同上

当然,这个地方要注意的是,foo里面的t【原创不易,请尊重版权】转载请注明出处:www.tangshuang.nethis必须是foo实例化时所指向的对象,【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net而不是指向其它对象的this。怎么解释呢未经授权,禁止复制转载。【原创不易,请尊重版权】,我们把foo改为:

【原创内容,转载请注明出处】【作者:唐霜】转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】
var foo = function() {
  function msg() {
    return this.value;
  }
  return msg();
};

当然,这是一个闭包,你可以先不理会闭包这【未经授权禁止转载】【转载请注明来源】回事,用本文的知识去分析,就会发现thi【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】s.value中的this并不指向foo【作者:唐霜】【访问 www.tangshuang.net 获取更多精彩内容】的实例化对象,因此随便你怎么改变实例化对著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】象,this始终还是指向window。

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

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

未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net

本文虽然讲了很多,但核心点实际上还是落在【未经授权禁止转载】转载请注明出处:www.tangshuang.netjavascript的面向对象这个点上。【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。javascript中虽然没有明确的cl【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.netass的概念,那是因为它首先基于type转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。这样的基础概念,并强调一切皆对象的这种思原创内容,盗版必究。【作者:唐霜】想。如果从哲学上讲,javascript原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net真正符合道生一,一生二,二生万物的原则。著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】不过本文没有提到和继承相关的内容,读者请【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net自己通过其他途径进行学习。

转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。

2016-03-19 9970

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

本文价值99.7RMB
已有2条评论
  1. […] 本文发布在我的个人博客,请到原地址交流: http://www.tangshuang.net/2280.html […]

  2. […] 本文发布在我的个人博客,请到原地址交流:http://www.tangshuang.net/2280.html […]