JavaScript原型、闭包、继承和原型链等等总结

来源:互联网 发布:淘宝甩手铺货 编辑:程序博客网 时间:2024/05/17 20:48

几年之前学习过Javascript,当时学得比较浅显,现在又开始学了,发现Javascript其实挺难的,有些地方还是得花时间去理解的,于是看了很多的视频和博客,自己在这里小小的总结下。。。

1.一切(引用类型)都是对象,对象是属性的集合。

      undefined, number, string, boolean属于简单的值类型,通过typeof来判断函数、数组、对象、null都是引用类型,通过instanceof来判断对象里面的一切都是属性,只有属性,没有方法,它的属性表示为键值对的形式。一切引用类型都是对象,对象都是通过函数来创建的。

2.prototype原型

     每一个函数都有一个属性叫做prototype,每一个对象(注也包括函数)都有一个属性叫做_proto_,其实可以把_proto_叫做隐式原型。 每一个函数的prototype属性值是一个对象(属性的集合,再次强调!),默认的只有一个叫做constructor的属性,指向这个函数本身。每一个对象都有一个属性叫做_proto_,指向创建该对象的函数的prototype。但是Object.prototype确实一个特例——它的__proto__指向的是null。如下图:


上图中f1是由Foo()创建的对象,f1._proto_指向Foo.prototype,Foo()函数的_proto_指向Object.prototype,同理,Object()函数创建的o1对象的_proto_指向Object.prototype,而Object.prototype通过_proto_指向的为null。

现在,注意区分function()和Function()。函数也不是从石头缝里蹦出来的,函数也是被创建出来的。谁创建了函数呢?——Function——注意这个大写的“F”。直接上图吧:

Function.prototype它的__proto__也指向Object.prototype

其实图看起来乱,但真正自己画起来不难,而且会特别有成就感的。

3。理解instanceof

   上一节说过,引用类型通过instanceof来判断。先看例题

   function Foo() {}

   var f1=new Foo();

   console.log(f1 instanceof Foo);   //true

   console.log(f1 instance Object);     //true

根据上面代码画出左边的图   

Instanceof的判断规则是:沿着A的__proto__这条线来找,同时沿着B的prototype这条线来找,如果两条线能找到同一个引用,即同一个对象,那么就返回true。如果找到终点还未重合,则返回false。

最后,咱们可以把所有的这些图联合成一个整体:


4.原型链和继承

   访问一个对象的属性时,先在基本属性中查找,如果没有,再沿着__proto__这条链向上找,这就是原型链。根据原型链可以确定继承关系。由于所有的对象的原型链都会找到Object.prototype,因此所有的对象都会有Object.prototype的方法。这就是所谓的“继承”。

实际应用中如何区分一个属性到底是基本的还是从原型中找到的呢?大家可能知道答案——hasOwnProperty,特别是在for…in…循环中,一定要注意。



5。执行上下文。

    “执行上下问”也叫坐“执行上下文环境”;

    在一段js代码拿过来真正一句一句运行之前,浏览器已经做了一些“准备工作”,其中就包括对变量的声明,而不是赋值。变量赋值是在赋值语句执行的时候进行的。总结下在“准备工作”中完成了哪些工作:

  • 变量、函数表达式——变量声明,默认赋值为undefined;
  • this——赋值;
  • 函数声明——赋值;

如果在函数中,除了以上数据之外,还会有其他数据。先看以下代码:

以上代码展示了在函数体的语句执行之前,arguments变量和函数的参数都已经被赋值。从这里可以看出,函数每被调用一次,都会产生一个新的执行上下文环境。因为不同的调用可能就会有不同的参数。且另外一点不同在于,函数在定义的时候(不是调用的时候),就已经确定了函数体内部自由变量的作用

全局代码的上下文环境数据内容为:

普通变量(包括函数表达式),

如: var a = 10;

声明(默认赋值为undefined)

函数声明,

如: function fn() { }

赋值

this

赋值

如果代码段是函数体,那么在此基础上需要附加:

参数

赋值

arguments

赋值

自由变量的取值作用域

赋值

给执行上下文环境下一个通俗的定义——在执行代码之前,把将要用到的所有的变量都事先拿出来,有的直接赋值了,有的先用undefined占个空。


写了这么多,其实图我都会手画,但是画在电脑上太花时间了,所以用来下一位博主的图,此博主写得超级好。我基本上是按此博主文章系列来写的。下面附上链接

http://www.cnblogs.com/wangfupeng1988/p/4001284.html








0 0