作家
登录

JavaScript深入之从原型到原型链

作者: 来源: 2017-04-07 13:34:57 阅读 我要评论

构造函数创建对象

我们先应用构造函数创建一个对象:

  1. function Person() { 
  2.  
  3. var person = new Person(); 
  4. person.name = 'name'
  5. console.log(person.name) // name  

在这个例子中,Person就是一个构造函数,我们应用new创建了一个实例对象person。

prototype

每个函数都有一个prototype属性,就是我们经常在各类例子中看到的那个prototype,比如:

  1. function Person() { 
  2.  
  3. // 固然写在注释里,然则你要留意: 
  4. // prototype是函数才会有的属性 
  5. Person.prototype.name = 'name'
  6. var person1 = new Person(); 
  7. var person2 = new Person(); 
  8. console.log(person1.name) // name 
  9. console.log(person2.name) // name  

那这个函数的prototype属性到底指向的是什么呢?是这个函数的原型吗?

其实,函数的prototype属性指向了一个对象,这个对象恰是调用该构造函数而创建的实例的原型,也就是这个例子中的person1和person2的原型。

那么什么是原型呢?你可以如许懂得:每一个JavaScript对象(null除外)在创建的时刻就会与之接洽关系另一个对象,这个对象就是我们所说的原型,每一个对象都邑大年夜原型"持续"属性。

让我们用一张图表示构造函数和实例原型之间的关系:


constructor

在这张图中我们用Object.prototype表示实例原型

那么我们该怎么表示实例与实例原型,也就是person和Person.prototype之间的关系呢,这时刻我们就要讲到第二个属性:

__proto__

这是每一个JavaScript对象(除了null)都具有的一个属性,叫__proto__,这个属性会指向该对象的原型。

为了证实这一点,我们可以在火狐或者谷歌中输入:

  1. function Person() { 
  2.  
  3. var person = new Person(); 
  4. console.log(person.__proto__ === Person.prototype); //true  

于是我们更新下关系图:

既然实例对象和构造函数都可以指向原型,那么原型是否有属性指向构造函数或者实例呢?

综上我们已经得出:

指向实例倒是没有,因为一个构造函数可以生成多个实例,然则原型指向构造函数倒是有的,这就要讲到第三个属性:construcotr,每个原型都有一个constructor属性指向接洽关系的构造函数

为了验证这一点,我们可以测验测验:

  1. function Person() { 
  2.  
  3. console.log(Person === Person.prototype.constructor); //true  

所以再更新下关系图:

  1. function Person() { 
  2.  
  3. var person = new Person(); 
  4.  
  5. console.log(person.__proto__ == Person.prototype) // true

      推荐阅读

      Windows 7系统怎样自动备份指定文件夹?

    如今不管是娱乐照样工作,都越来越离不开电脑,很多用户都邑将一些重要文件存放在电脑中,如不雅说没有备份的话,极易造成一些文件损掉,那么在这种情况下,我们可以应用Win7体系中的主动>>>详细阅读


    本文标题:JavaScript深入之从原型到原型链

    地址:http://www.17bianji.com/lsqh/34639.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)