我们知道无论什么时候只要创建了一个函数,就会为该函数创建一个prototype属性,这个属性指向函数的原型对象,默认情况下所有原型对象都会自动获得一个constructor(构造函数)属性,这个属性包含了一个指向prototype属性所在函数的指针。当调用构造函数创建一个新实例后,该实例内部就会包含一个[[prototype]]指针(内部属性),指向构造函数的原型对象。例如以下的代码:

    function Person(){
}
Person.prototype.name = "pan";
Person.prototype.age = 23;
};
var person1 = new Person();

这段代码中Person构造函数、Person的原型属性以及Person的现有实例person之间的关系可以用下图来表示:

在这里,Person.prototype指向了原型对象,而Person.prototype.constructor又回指了Person。实例person1包含了一个指向Person.prototype的内部属性[[Prototype]]。

现在来看看我们上面的图是否说对了呢?

    function Person(){
}
Person.prototype.name = "pan";
Person.prototype.age = 23;
var person1 = new Person();
console.log(Person.prototype);
console.log(person1.__proto__);
console.log(Person.prototype.constructor);
console.log(person1.__proto__.constructor);
console.log(person1.name);

我们可以看到Person.prototype与person1.__proto__都是同一个对象Person{},所以Person.prototype.constructor和person1.__proto__.constructor都是Person这个函数。又因为person1可以利用原型链向上查找到Person.prototype的属性并使用,所以person1.name的值为pan。

原型链

prototype是函数的一个内置属性,这个属性是一个指针,指向原型对象;

_proto_([[prototype]])是对象的内置属性,而函数也是一个对象,所以就会形成一条_proto_连起来的链条,形成原型链,递归访问_proto_的尽头是null

举个栗子:

var A = function(){}
var a = new A();

会有如下的原型链关系

a的_proto_指向A.prototype(A的原型对象),A.prototype的_proto_指向Object.prototype(Object的原型对象),Object.prototype的_proto_最终指向的是null

下面是一张更详细的原型链图(来自网上)

最新文章

  1. java 跨域
  2. software_testing_work3_question2
  3. Beta版本冲刺第一天 12.5
  4. 高效快捷解决一个TextView显示多种字体的控件SpannableTextView
  5. Android M Permission 学习笔记
  6. UNIX网络编程——网络IPC:套接字
  7. 对web日志文件实现按照人员、行为分类
  8. 《MFC游戏开发》笔记四 键盘响应和鼠标响应:让人物动起来
  9. Codeforces 475C Kamal-ol-molk's Painting 模拟
  10. Orchard Module,Theme,Core扩展加载概述
  11. 前端基本知识(二):JS的原始链的理解
  12. Net Core 生成图形验证码
  13. Java高阶语法---transient
  14. 第23课 可变参数模板(4)_Optional和Lazy类的实现
  15. Java集合总结(List、Map、Set)
  16. python中的常用模块
  17. 20145201李子璇 《网络对抗》 Web基础
  18. Java:准备学习的高级主题
  19. web安全-XSS
  20. 设计模式——Spirng_Bean工厂

热门文章

  1. 清晰讲解LSB、MSB和大小端模式及网络字节序
  2. BZOJ 2301 Problem b (莫比乌斯反演+容斥)
  3. 【转】Google的2012论文
  4. 写入Csv
  5. eclipse上的.properties文件中文编辑显示处理
  6. python单元测试框架——pytest
  7. Spark高级数据分析· 6LSA
  8. 20145314郑凯杰 《Java程序设计》第3周学习总结
  9. uboot源码中"include/configs/$(boardname).h"与"configs/$(boardname)_defconfig"之间有何异同
  10. Flutter中集成Font Awesome