原型链(_proto_) 与原型(prototype) 有啥关系?

prototype对象里面方法及属性是共享的。。。。。。 

1.JavaScript 中每一个对象都拥有原型链(__proto__)指向其构造函数的原型( prototype),object._proto_是个例外!

2.JavaScript 中每一个函数都拥有原型( prototype ),原型也是一个对象,这个对象包括:原型链、原型方法(属性)、函数构造,同理它的原型链指向其构造函数的原型。

3.当访问一个对象或者函数上的属性时,先尝试访问自身上的属性,再通过原型链尝试访问其创造构造函数那个原型上的属性。如果没有则通过原型上的原型链,继续向上查找,直到访问 Object.prototype 上的属性,如果还是没有,因为 Object.prototype 是一个没有 __proto__ 的对象,Object._proto_指向null,则查询到此为止,返回 undefined。

 Object顶级!!!

1.原型对象(例如:a)的__proto__指向它的构造函数的原型对象(object.prototype)。

2、原型对象也有一个属性,叫做constructor,这个属性包含了一个指针,指回原构造函数。>>>>(son.prototype.constructor) === Person()    //true

 注意:object.prototype是被object new出来的实例函数a的原型,object.prototype中的prototype是object的属性!!!

var a = {};

a._proto_  ===  object.prototype              //true

object.prototype._proto_                           //underfined   ,最终指向null;  _proto_实例化才产生!!Object.prototype 是一个没有 __proto__ 的对象!!

function Person() {};

Person._proto_  ==== Function.prototype         //true

var son = new Person();

son._proto_   ===  Person.prototype;                //true                       _proto_指向创建实例化的对象原型。

Person.prototype.smile = function() {};         >>>>>>>>>>> ["constactor":"smile"]

.......................................................................................................................................................................

subA.prototype = new superA() // 继承方法

var a1 = new subA('xiaomuchen')

/*当实例化 a1 时,a1.__proto__ => subA.prototype => new superA() => superA.prototype,所以 a1 的构造函数是 superA*/

Function.prototype.__proto__===Object.prototype;       //true;

 

                                                _proto_关系图

友情链接:https://www.v2ex.com/t/403680

原文地址:https://www.cnblogs.com/Longhua-0/p/9280418.html