首先看下面一行代码:

function Person(name){this.name = name;
}
var person1 = new Person;
console.log(person1.__proto__ === Person.prototype);
console.log(person1.constructor === Person);

控制台打印如下:

可以看见,当使用构造函数(Person)构造一个实例(person1)时,
在后台其实生成了2种关系,

第一种是:person1的 __proto__ 属性指向构造函数的原型(Person.prototype)
第二种是:实例(person1)的constructor属性指向该函数(Person).其原理如下:
---> 第一种关系: person1.__proto__ === Person.prototype
一个构造函数通过new生成一个实例person1时,实际上有一个内部属性 [[Prototype ]],它指向对象的原型(即:Person.prototype).
[[Prototype]](内部)属性的读取(2种):
1.可以通过Object.getPrototypeOf()方法读取,这种方法比较长...
2.第二种方法是基于,JavaScript引擎在所有对象上都支持一个名为_proto_的属性.通过它,可以直接读写[[Prototype]]属性.(写法比较方便)---> 第二种关系: person1.constructor === Person
1.当一个函数(这里指构造函数Person)被创建时,它的prototype属性也被创建,且该原型对象的constructor属性(Person.prototype.constructor)指向该函数
Person,即Person.prototype.constructor === Person,
2.当在实例person1种寻找constructor属性时,未找到,于是根据[[Prototype]]的指针(即:__proto__)属性,寻找其原型对象(Person.prototype)中的constructor属性,进而找到Person,最终有person1.construcoter === Person// 注意:虽然person1.constructer === Person , Person.prototype.constructor === Person, 但person1 !== Person.prototype,
// 因为person1中是通过[[Prototype]] "指针"指向Person.prototype的!!!

在知道了上面2种关系后,下面在看一个例子:

function P(name) {this.name = name;
}
P.prototype = {sayName: function () {console.log(this.name);}
};var p1 = new P();
console.log(p1 instanceof Person);
console.log(p1.constructor === Person);
console.log(p1.constructor === Object);

---> 对于第一行的true
1.a instanceof A是指,a是A的实例
2.因为var p1 = New P() , 明显是对的---> 对于第二行的false, 第3三行true
1.使用P.prototype进行字面量赋值时,实际上是对P的原型进行了重写,而上面例子未对(P.prototype)重写后的construcoter属性
进行说明
2.JavaScript默认其为一个泛用对象Object,因此其constructor属性指向了Object.

倘若我们在对P.prototype进行字面量赋值的同时,加上constructor属性,使其指向P,见下例:

function P(name){this.name = name;
}
P.prototype = {constructor: P,sayName:  function() {console.log(this.name);}
}
var p1 =new  P("marron");console.log(p1 instanceof P) ;
console.log(p1.constructor === P);


可以看见,p1.constructor指向了函数P.即可以通过实例的constructor函数找到函数P…

参考《JavaScript面向对象精要》第4章

javascript --- js中prototype、__proto__、[[Propto]]、constructor的关系相关推荐

  1. js中prototype,constructor的理解

    连看4篇前辈的文章,记录一些知识点 Javascript继承机制的设计思想 Javascript 面向对象编程(一):封装 Javascript面向对象编程(二):构造函数的继承 Javascript ...

  2. JS中prototype、__proto__以及原型链

    1.对象的三角恋关系 1.每个"构造函数"中都有一个默认的属性, 叫做prototype prototype属性保存着一个对象, 这个 对象 称之为"原型对象" ...

  3. JS中Prototype属性解释及常用方法

    1.prototype的定义 javascript中的每个类都有prototype属性,其prototype属性的解释是:返回对象类型原型的引用.每一个构造函数都有一个属性叫做原型.这个属性非常有用: ...

  4. 夯实JavaScript基础之prototype, __proto__, instanceof

    function New(f){return function(){var o = {'__proto__': f.prototype};f.apply(o, arguments);return o; ...

  5. js中prototype用法(转)

    JavaScript能够实现的面向对象的特征有: ·公有属性(public field) ·公有方法(public Method) ·私有属性(private field) ·私有方法(private ...

  6. JS中prototype介绍

    转载 原文点这里 用过JavaScript的同学们肯定都对prototype如雷贯耳,但是这究竟是个什么东西却让初学者莫衷一是,只知道函数都会有一个prototype属性, 可以为其添加函数供实例访问 ...

  7. javascript --- js中的事件

    事件实现松耦合: // JS和HTML之间的交互是通过事件实现的. // 事件,就是文档或浏览器窗口中发生一些特定的交互瞬间. // 可以使用侦听器来预定事件,以便事件发生时执行相应的代码. // 这 ...

  8. js中prototype用法

    prototype 是在 IE 4 及其以后版本引入的一个针对于某一类的对象的方法,而且特殊的地方便在于:它是一个给类的对象添加方法的方法!这一点可能听起来会有点乱,别急,下面我便通过实例对这一特殊的 ...

  9. [置顶]       Javascript js中页面的重新加载

    用JavaScript刷新上级页面和当前页面 <script type="text/javascript"> //刷新上级页面 //window.parent.main ...

最新文章

  1. python代码检测链表中的环并删除环
  2. Apache-2.2.32安装配置
  3. Hud 敌兵布阵 --线段树的插点问线
  4. 【Java】递归删除文件目录
  5. 比亚迪汉家族3月热销12359辆 汉EV单车销量破万
  6. python a or b 输出值为_深入分析python的and or 返回值
  7. 如何在网站中使用php,如何在网站的所有其他PHP文件中包含PHP文件?
  8. Lesson 02amp;03 for Plotting in R for Biologists
  9. 【MyBatis】动态SQL中的参数判空
  10. c++ PP第九章最后一题
  11. 1.转子动力学——引言
  12. 雷塞控制器SMC304简单介绍
  13. Android和Linux应用综合对比分析
  14. 《数据库系统概论》| 第四章 数据库安全性 知识梳理
  15. 央行:推动企业征信市场高质量发展
  16. 显示器知识:分辨率1080P、2K、4K、8K相关知识介绍,看完你就懂了!
  17. fastadmin 百度编辑器无法上传图片的几种原因和修改方法
  18. 大数据的产业链分析,大数据完整的产业链构成
  19. 比比网开源的一款头像制作小程序
  20. matlab 医学断层图像,利用MATLAB实现CT断层图像的三维重建

热门文章

  1. android长按加入购物车,《Android APP可能有的东西》之UI篇:加入购物车动画
  2. python类的空间问题及类之间的关系
  3. eclipse报错: Could not generate secret
  4. angular中封装fancyBox(图片预览)
  5. C++ Primer 5 CH4 表达式
  6. 夜深人静,想规划一下短期
  7. SQL Server 2008安装配置说明书+简单使用 亲测可用
  8. 自执行匿名函数剖析整理
  9. JavaScript 数组处理方法总结
  10. MFC的sendmessage和postmessage 以及sendmessagetimeout