JavaScript的数据类型能够分为基本数据类型和引用数据类型。编程
基本数据类型(6种)函数
引用数据类型this
构造函数spa
构造函数就是一个普通的函数,为了与普通函数区别,构造函数名字的第一个字母一般大写。prototype
构造函数的特色有两个。code
- 函数体内部使用了this关键字,表明了所要生成的对象实例。
- 使用new命令生成对象。
2. new命令
new命令的做用,就是执行构造函数,返回一个实例对象。对象
new 命令的原理blog
若是构造函数内部有return语句,并且return后面跟着一个对象,new命令会返回return语句指定的对象;不然,返回this对象。ip
var Fn=function(){ this.name='xxx'; this.old=18; } var f1=new Fn(); console.log(f1.name);//xxx console.log(f1.old);//18
上面代码经过new命令,让构造函数Fn生成一个实例对象,保存在变量f1中。这个新生成的实例对象,从构造函数Fn获得了name和old属性。new命令执行时,构造函数内部的this,就表明了新生成的实例对象,this.name和this.old是实例对象的属性。原型链
var Fn2=function(){ name='xxx'; old=18; } var f2=new Fn2(); console.log(f2.name);//undefined console.log(f2.old);//undefined f2.name='yyy'; console.log(f2.name);//yyy
对象是函数建立的,而函数却又是一种对象。也是属性的集合,能够对函数进行自定义属性。
每一个函数都有一个属性叫作prototype。
这个prototype的属性值是一个对象,默认的只有一个叫作constructor的属性,指向这个函数自己。
var Fn=function(){ this.name='xxx'; this.old=18; }
回到上面new命令的原理的第二条,从这张图能够看到对象的原型,指向构造函数的prototype属性。
f1.__proto__
指向构造函数的prototype属性,就是对象的原型。因此f1.__proto__===Fn.prototype为true
prototype的属性值是一个对象,默认的只有一个叫作constructor的属性,指向这个函数自己。
左边为Fn函数,右边就是它的原型
在上面能够看到f1.__proto__===Fn.prototype
的结果为true
__proto__
就是指向构造函数的prototype属性,Fn.prototype
就是对象的原型
即,每一个由构造函数建立的对象都有一个__proto__属性,指向建立该对象的函数的prototype。
基于以上,咱们获得一个重要的公式
var 对象名 = new 函数名()
对象名.__proto__=== 函数名.prototype
小结
自定义函数.__proto__指向Function.prototype
Object.__proto__指向Function.prototype
即Object.__proto__ === Function.prototype//true
Function.__proto__指向Function.prototype
:Function也是一个函数,函数是一种对象,也有__proto__
属性。既然是函数,那么它必定是被Function建立。因此Function是被自身建立的。因此它的__proto__
指向了自身的Prototype。Function.prototype.__proto__===Object.prototype//true
__proto__指
向的是null总之记住下面这几个要点
重要的公式
var 对象名 = new 函数名()
对象名.__proto__=== 函数名.prototype
__proto__
这个属性Object.prototype.__proto__===null
结果为true