js原型对象和原型链理解
参考:https://blog.csdn.net/yucihent/article/details/79424506
文章内的图是参考一个大神的 但是找不到链接了
一. 函数对象
- 所有引用类型(函数,数组,对象)都拥有__proto__属性(隐式原型)
- 所有函数拥有prototype属性(显示原型)(仅限函数)
var a = {};
console.log(a.prototype); //undefined
console.log(a.__proto__); //Object{}
var b = function(){};
console.log(b.prototype); //Object{}
console.log(b.__proto__); //function(){}
由上述代码可知,prototype是函数才有的属性
- 原型对象:拥有prototype属性的对象,在定义函数时就被创建
- 原型对象的结构:
Function.prototype ={
constructor:Function,
__proto__ : parent prototype,
some prototype properties:
};
二. __proto__属性指向
__proto__属性指向取决于对象创建时的实现方式
方式一:字面量方式
var a = {};
方式二:构造器方式
var A = function(){};
var a = new A();
方式三:Object.create()方式
var a1 = {};
var a2 = Object.create(a1);
__大多数情况下,proto__可以理解为“构造器的原型”,即__proto === constructor.prototype
(实例的隐士原型指向它构造函数的显示原型 这里的指向即恒等于)
三: 原型和原型链
-
什么是原型链?
由于__proto__是任何对象都有的属性,而js万物皆对象,所以会形成一条__proto__链接起来的链条,递归访问__proto__必须最终到头,并且值是null
当js引擎查找对象的属性时,先查找对象本身是否存在属性。如果不存在,会在原型链(其构造函数的prototype)上查找 -
示例
var A = function(){} var a = new A();
-
如图所示
- a.__proto__ ——> A.prototype(构造器function A 的原型对象) - a.__proto__.__proto__ ——> Object.prototype(构造器 function object的原型对象) - a.__proto__.__proto__.__proto__ ——> null
-
示例:
Function.prototype.a = "a"; Object.prototype.b = "b"; function Person(){} console.log(Person); //function Person() var p = new Person(); console.log(p); //Person {} 对象 console.log(p.a); //undefined console.log(p.b); //b