当前位置: 首页 > Web前端 > HTML5

如何理解_proto_和prototype

时间:2023-04-05 11:21:31 HTML5

(如何理解_proto_和prototype)原型空间我们知道js中的一切都是对象,现在我们假设每个对象在创建的时候都会生成一个原型空间(prototypeobject)现在我们记住三句话,instancesaredefinedbysharedprototypes空间是通过__proto__找到的定义的原型空间是通过prototype找到的实例是通过共享原型空间定义的psp:prototype[p]:_proto_此图转载此图转载从上面两张图可以清楚的看到看到这个关系,我们就可以形成一个原型链。所有函数都由Function构造函数构造。function函数也是由Function构造函数构造的。所以当函数构造自身时,它指向自己的原型空间。我们可以看到图中的函数。原型空间的原型空间和animal的原型空间都是object类型(其实第二列的原型空间是object的实例,但逻辑上不是)//所有函数类型的隐式原型都是一样的因为都是Function的原型对象创建的//所以构造函数的__proto__是Function//那么Function的隐式原型呢?varfun=newFunction();console.log(fun.__proto__===Function.prototype);console.log(Function.__proto__===Function.prototype);//所以Function本身的隐式原型和显示原型是一样的//可见Object也是由函数定义的,所以它的隐士原型应该是Function的显示原型console.log(Object.__proto__===Function.prototype)那么对象的原型空间的原型空间应该是undefined的,但是这样会使原型链无穷无尽。为了逻辑上的完美,让它为空。可见,原型空间的定义是由它所定义的原型空间来定义的。(实例及其定义共享原型空间)()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)varanimal=newAnimalconsole.log(animal.__proto__.__proto__)varobj={}console.log(typeof(obj.__proto__.__proto__))////ps没有修复构造那么如果假设Pobject定义了Object的原型空间的原型空间,那么图中所有(未定义)位置的_proto_都会指向Pobject的原型空间。有了这个逻辑,就可以无限迭代了(指针的指针..Pointerto...)这样,向上查找原型链和向下查找原型链是统一的,但是js设计阻塞了向上无限迭代(Object的原型空间为null)