#JS#原型链(prototype chain)

原创 2016年11月06日 11:13:10

什么是原型链

涉及到继承这一块,Javascript 只有一种结构,那就是:对象。在 javaScript 中,每个对象都有一个指向它的原型(prototype)对象的内部链接。这个原型对象又有自己的原型,直到某个对象的原型为 null 为止(也就是不再有原型指向),组成这条链的最后一环。这种一级一级的链结构就称为原型链(prototype chain)
——MDN文档

JS原型链模型

图1 JS原型链模型

要了解的几个概念

1.构造子(constructor)
2.prototype: constructor的一个属性,指向constructor的原型
3.__proto__:constructor 构造的object的一个属性,指向constructor的原型
4.constructor:构造子(constructor)的原型的一个属性,反指向构造子(constructor)
构造子(constructor)依照 constructor的原型 构造出object.
几个概念的图示

图2 上述几个概览的关系

好处

可能你会接的这样好麻烦,但这正JS的原型继承模式的精华所在,它赋予了JS继承的高度动态性。

var a = function (name) {this.m_name = name;} // 构造子(constructor)
var o1 = new a("unname"); // 创建实例o1
o1.say; // undefined
a.prototype.say = function() {console.log("my name is "+ this.m_name);}; 
// 给a.prototype即o1.__proto__增添新属性
o1.say(); // my name is unname

会不会有点奇怪,o1明明一开始是没有say的,后来怎么又有了?
这正是JS原型链的特性!当一个object没有一个属性的时候,他会向他的__proto__去找这个属性,如果没找到就再往上一层__proto__去找,直到找到或者找到原型链的尽头null这里的o1是没有say这个属性的,但是他在他的__proto__找到了,所以能执行。
因此o1.constructor == a,是true的,因为o1.从他的proto找到了constructor这个属性,得到指向o1的构造子(constructor)即a的引用。

从而我们可以用向object的构造子(constructor)的prototype添加属性的方法,向所有已经构造或者没构造的object添加方法。
这正是JS原型链继承方法的高度动态性!

更深入

几个概念的图示

图2 上述几个概览的关系

还是这张图,于是出现了2个问题:
1.object的构造子(constructor)是谁构造出来的?
2.object.__proto__是谁构造出来的?
我们先探讨问题1:

var a =function(){this.name = "constructor"}
a.constructor// Function() { [native code] }

原来构造子(constructor)是由一个原生构造子Function(){ [native code]}构造的。
那么问题又来了,那这个原生构造子(constructor)又是谁构造的?

a.constructor.constructor//Function() { [native code] }
a.constructor.constructor == a.constructor // true

我们神奇地发现它竟然是由自己构造出来的!!!!

再探讨问题2:

var ob = new a();
typeof ob.__proto__; // object

原来ob.__proto__是一个对象,那么他的__proto__是什么?

 ob.__proto__.__proto__; //  Object()
 typeof ob.__proto__.__proto__; // object

还是一个对象,再上面是什么?

typeof ob.__proto__.__proto__.__proto__; // null

我们惊奇地发现!在上面没有了,到顶了!
那么这个最上面的对象那里来的??

 ob.__proto__.__proto__.constructor;
 //Object() { [native code] }

 ob.__proto__.__proto__.constructor.prototype;
 //Object {}
  ob.__proto__.__proto__.constructor.prototype == ob.__proto__.__proto__ ;
  // true

于是我们发现最上层object的构造子是原生的objector构造子Object() { [native code] },然后最上层object以自己为模板构造了自己!!

##结论##
于是我们发现最后是
一个自构造的构造子Function() { [native code] }构造了所有构造子!
一个以自己为原型的最上层object是所有object的最终原型!
用一张图说明就是:
JS原型链

图3 JS原型链

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

javascript作用域链(Scope Chain)初探

有些东西 看了不及时的记录下来,久了也就忘记了。 文章是转载过来的,转载的初衷是有人问:“词法作用域”“语法作用域”怎么理解 关于js的作用域链,早有耳闻,也曾看过几篇介绍性的博文,但一直...

js 原型链 __proto__ prototype

原型链 在创建一个函数时,就自动为该函数添加一个prototype属性, 该属性指向原型对象,默认情况下,该对象中只包块一个constructor属性, 它是一个指向prototype属性所在函数的指...

理解js中的原型链,prototype与__proto__的关系

理解js中的原型链,prototype与__proto__的关系 说到prototype,就不得不先说下new的过程。 我们先看看这样一段代码: ...
  • huithe
  • huithe
  • 2012年03月02日 21:31
  • 653

详解js中的原型链,prototype与__proto__的关系

说到prototype,就不得不先说下new的过程。 我们先看看这样一段代码: type="text/javascript"> var Person = function (...

阐述JS中原型链及prototype和__proto__的区别

阐述JS中原型链及prototype和__proto__的区别

理解js中的原型链,prototype与__proto__的关系

理解js中的原型链,prototype与__proto__的关系 By Lone onNovember 10, 2011 说到prototype,就不得不先说下new的过程。 我们先看看这样一段...

Javascript原型链的原理,JS的__proto__,prototype相关知识!

说到prototype,就不得不先说下new的过程。我们先看看这样一段代码:var Person = function () { };var p = new Person();script>很简单的一...

JS中的prototype 原型链

prototype源自法语,软件界的标准翻译为“原型”,代表事物的初始形态,也含有模型和样板的意义。JavaScript中的prototype概念恰如其分地反映了这个词的内含,我们不能将其理解为C++...

理解js中的原型链,prototype与__proto__的关系

理解js中的原型链,prototype与__proto__的关系 By Lone on November 10, 2011 说到prototype,就不得不先说下new的过程。 我们先看看...

JS原型链中 _proto_和prototype及constructor的关系

总结: 1、对象有属性_proto_,指向prototype。a. 对象的_proto_指向其构造方法的原型对象。b. 原型对象的_proto_指向上一级原型对象。c. 2、方法除了有_proto_,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:#JS#原型链(prototype chain)
举报原因:
原因补充:

(最多只允许输入30个字)