几年之前学习过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