JavaScript原型与原型链

1、数据类型

JavaScript的数据类型能够分为基本数据类型和引用数据类型。编程

  1. 基本数据类型(6种)函数

    • String
    • Number
    • Boolean
    • null
    • undefined
    • Symbol(ES6)
  2. 引用数据类型this

    • Object

2、面向对象编程

  1. 构造函数spa

    • 面向对象编程的第一步,就是要生成对象。前面说过,对象是单个实物的抽象。一般须要一个模板,表示某一类实物的共同特征,而后对象根据这个模板生成。
    • JavaScript 语言使用构造函数(constructor)做为对象的模板。所谓”构造函数”,就是专门用来生成实例对象的函数。它就是对象的模板,描述实例对象的基本结构。一个构造函数,能够生成多个实例对象,这些实例对象都有相同的结构。
  • 构造函数就是一个普通的函数,为了与普通函数区别,构造函数名字的第一个字母一般大写。prototype

    构造函数的特色有两个。code

    • 函数体内部使用了this关键字,表明了所要生成的对象实例。
    • 使用new命令生成对象。

2. new命令
new命令的做用,就是执行构造函数,返回一个实例对象。对象

new 命令的原理blog

  1. 建立一个空对象,做为将要返回的对象实例。
  2. 将这个空对象的原型,指向构造函数的prototype属性。
  3. 将这个空对象赋值给函数内部的this关键字。
  4. 开始执行构造函数内部的代码。

若是构造函数内部有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

3、原型与原型链

对象是函数建立的,而函数却又是一种对象。也是属性的集合,能够对函数进行自定义属性。
每一个函数都有一个属性叫作prototype。
这个prototype的属性值是一个对象,默认的只有一个叫作constructor的属性,指向这个函数自己。

var Fn=function(){
    this.name='xxx';
    this.old=18;
}

clipboard.png

回到上面new命令的原理的第二条,从这张图能够看到对象的原型,指向构造函数的prototype属性。

f1.__proto__指向构造函数的prototype属性,就是对象的原型。因此f1.__proto__===Fn.prototype为true

prototype的属性值是一个对象,默认的只有一个叫作constructor的属性,指向这个函数自己。

clipboard.png

左边为Fn函数,右边就是它的原型

在上面能够看到f1.__proto__===Fn.prototype的结果为true
__proto__就是指向构造函数的prototype属性,Fn.prototype就是对象的原型

即,每一个由构造函数建立的对象都有一个__proto__属性,指向建立该对象的函数的prototype。

基于以上,咱们获得一个重要的公式
var 对象名 = new 函数名()
对象名.__proto__=== 函数名.prototype

小结

  1. 自定义函数.__proto__指向Function.prototype
  2. Object.__proto__指向Function.prototypeObject.__proto__ === Function.prototype//true
  3. Function.__proto__指向Function.prototype:Function也是一个函数,函数是一种对象,也有__proto__属性。既然是函数,那么它必定是被Function建立。因此Function是被自身建立的。因此它的__proto__指向了自身的Prototype。
  4. Function.prototype.__proto__===Object.prototype//true
  5. Object.prototype的__proto__指向的是null

总结

  1. 对象是函数建立的,而函数却又是一种对象。也是属性的集合
  2. 每一个函数都有一个属性叫作prototype。
  3. 对象的原型,指向构造函数的prototype属性。
  4. prototype的属性值是一个对象,默认的只有一个叫作constructor的属性,指向这个函数自己。
  5. 原型既然做为对象,属性的集合,能够自定义的增长许多属性。

总之记住下面这几个要点

  1. Object对象是由Function函数建立的
  2. 全部函数都是由Function建立的,函数也是对象
  3. 重要的公式

    • var 对象名 = new 函数名()
    • 对象名.__proto__=== 函数名.prototype
  4. 普通函数的prototype属性值是一个对象
  5. Function.prototype有__proto__这个属性
  6. Object.prototype.__proto__===null结果为true
相关文章
相关标签/搜索