_proto_实际上是某个实例对象的隐藏属性,而prototype是其构造器函数(或者说‘类’)的原型属性;
function Mine() {}
var hi = new Function(),
ha = new Object(),
me = new Mine();
由构造器函数创建的实例对象,也就是用new Function(),new Object(),new Mine()等方法创建的实例对象都有一个隐藏的内部属性,__proto__指向其构造器原型prototype的引用 ,也就是 实例.__proto__ = 构造器.prototype
实例对象和构造器之间通过这个隐藏属性实现通信连接
而其构造的原型又有一个__proto__属性 构造器.prototype.__proto__ = 构造器的构造器.prototype
一直往上找
构造器的构造器.prototype.__proto__ = 构造器的构造器的构造器.prototype;
...(假设该构造器是由父构造器一层一层构造出来的,实际可能只有一两层)
构造器的构造器的构造器.prototype.__proto__ == Function.prototype;
Function.prototype.__proto__ = Object.prototype;
Object.prototype.__proto__ = null;
结束了
function Mine(){
console.log(this.constructor)
}
var obj = new Mine();
obj.__proto__ == Mine.prototype;//true
console.log(obj.__proto__) // Mine {} 一个空的普通原型对象
obj.__proto__ == Mine //false 说明实例对象的原型链引用是指向其构造的原型属性的而不是直接指向构造器本身的
Mine.prototype.__proto__ == Object.prototype //true
Object.prototype.__proto__ == null;//true
Mine.prototype.__proto__ == Function.prototype //false
var objA = { name:"Mack",sex:'male' };
function Human(){};
Human.prototype=objA;
在还没有实例化之前我们调用Human.__proto__会得到什么呢?
Human.__proto__//function () {}
var designer=new Human();
designer.name="Jo";
designer.age="26";
现在我们来访问新建对象designer的属性,
designer.name//Jo
designer.age//26
这是新建对象本身就有的属性,当然我们也可以访问designer从其构造器函数那里继承来的属性。
designer.sex;//male;
加载机制,首先会在自身属性中找,没找到就去其原型中找,就好像有一个神秘的链接指向了相关的"原型对象";
//这里有歧义
designer.__proto__== (Human.prototype) == objA;//true;
designer.__proto__== new Human().prototype;//true;
designer.__proto__== Human.prototype;//true
what's the fuck?都尼玛为true,好忧伤的定义啊
_proto_实际上是某个对象实例的属性,而prototype这是其构造器函数的属性,或者说类的原型属性,所以两者并不等价;
typeof designer.__proto__;
//object;
typeof designer.prototype;
//undefined;实例对象没有原型属性 所以输出未定义
designer.constructor // ????
typeof designer.constructor.prototype;
//object