如何理解_proto_和prototype
(如何理解_proto_和prototype)
原型空间
我们知道在js中万物皆对象,现在我们假设每一个对象创建时都会产生一个原型空间(原型对象 )
现在我们记住三句话
实例由其定义共享原型空间
由__proto__来寻找定义的原型空间
由prototype来寻找自己的原型空间
实例由其定义共享原型空间
ps
p:prototype [p]: _proto_ 此图片为转载
此图片为转载
从上面两张图可以清楚看出这种关系这样就可以形成原型链
所有函数都是由Function构造函数构造的
function函数也是Function构造函数构造的所以时function自己构造了自己所以自己指向自己的原型空间
我们可以看出图中function的原型空间和animal的原型空间都是object类型(其实第二列的原型空间都是object的实例,但逻辑上不是)
//所有函数类型的隐式原型都相同 因为都是Function的原型对象创建 //所以构造函数的__proto__是Function //那么Function的隐式原型 ? var fun = new Function(); console.log(fun.__proto__===Function.prototype); console.log(Function.__proto__===Function.prototype); //所以Function本身的隐式原型和显示原型相同 //可以看出Object也是函数定义的所以他的隐士原型应该是Function 的显示原型 console.log(Object.__proto__===Function.prototype)
那么object的原型空间的原型空间应该是undefined但这样就会让原型链没有尽头
为了逻辑完善就令其为null
可以看出原形空间的定义是由其定义的原型空间来定义的(实例和其定义共享原型空间)
function Animal(){} function Bird(){} function Swallow(){} Bird.prototype= new Animal() Swallow.prototype=new Bird() var swallow = new Swallow() console.log(swallow.__proto__.prototype) console.log(Swallow.__proto__.prototype) console.log(Bird.__proto__.prototype) console.log(Animal.__proto__.prototype) console.log(Function.prototype.__proto__.prototype) console.log(Swallow.prototype) console.log(Animal.prototype) var animal = new Animal console.log(animal.__proto__.__proto__) var obj = {} console.log(typeof (obj.__proto__.__proto__)) ////ps没有修正construct
那么若假设Pobject来定义了Object的原型空间的原型空间那么图中所有的(undefined)的位置的_proto_都会指向Pobject的原型空间以这个逻辑就可以让无限迭代下去(指针的指针的.....的指针)
这样向上寻找原型链和向下寻找原型链就统一了,但js设计封锁了向上无限迭代(Object的原型空间为null)
相关推荐
源码zanqunet 2020-10-28
theowl 2020-08-18
qiximiao 2020-08-03
风萧萧梦潇 2020-07-28
Andrewjdw 2020-07-26
huakai 2020-07-26
XCMercy 2020-07-19
georgeandgeorge 2020-07-19
Jonderwu 2020-07-19
源码物语 2020-07-18
XGQ 2020-06-21
aNian 2020-06-16
郴州小程序 2020-06-13
园搬家测试账号 2020-06-12
Wonder的学习 2020-06-08
小方哥哥 2020-06-07
LULUBAO 2020-06-05
学习备忘录 2020-06-03
RocNg 2020-06-01