聊聊js中原型链

441 阅读1分钟

首先,有三条定义:

1.所有引用类型(函数,数组,对象)都拥有__proto__属性(隐式原型)

2.只有函数拥有prototype属性(显式原型)

3.原型对象:拥有prototype属性的对象,在定义函数时就被创建

例子1:

const a ={}
a._proto_.constructor == a.constructor // true

例子2:

function c(){}
var b= new c();
b.__proto__.constructor === c // true
b.constructor === c  //true
c.constructor=function(){
}

个人结论:

任何对象都包含constructor 这一属性,指向构造它的函数。

_proto_中含有constructor属性,也指向构造它的函数。

--------------------分割------------------

在js中万物皆对象,方法(Function)是对象,方法的原型(Function.prototype)是对象,对象具有属性(__proto__)称为隐式原型,对象的隐式原型指向构造该对象的构造函数的显式原型。

方法(Function)是一个特殊的对象,除了和其他对象一样具有__proto__属性以外,它还有一个自己特有的原型属性(prototype),这个属性是一个指针,指向原型对象。原型对象也有一个属性叫constructor,这个属性包含一个指针,指向原构造函数。

注意:Object.prototype.这个对象的是个例外,它的__proto__值为null。

以下为实验结果。

b.__proto__===c.prototype //true
b.__proto__.Prototype===Object.Prototype
Object.__proto__===Function.prototype //true 此处object作为对象

Array.__proto__===Function.prototype //true
Array.prototype.__proto__===Object.prototype //true 此处object为构造函数
Function.__proto__===Function.prototype // true
Object.prototype._proto_ == null // true