乐趣区

如何理解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)

退出移动版