prototype和__proto__的区别
1.每个对象都具有一个名为__proto__的属性;
2.每个构造函数(构造函数标准为大写开头,如Function(),Object()等等JS中自带的构造函数,以及自己创建的)都具有一个名为prototype的方法(注意:既然是方法,那么就是一个对象(JS中函数同样是对象),所以prototype同样带有__proto__属性);
3.每个对象的__proto__属性指向自身构造函数的prototype;
// 创造一个函数Fun,这个函数由Function这个构造函数生成 function Fun(){} // 这个函数由Fn生成,这样Function,Fun,fn就构成了原型链 var fn = new Fun()
// fn的__proto__指向其构造函数Fun的prototype console.log(fn.__proto__===Fun.prototype); // true // 类似上面的 console.log(Fun.__proto__===Function.prototype);//true // Function的__proto__指向其构造函数也就是自己本身的prototype console.log(Function.__proto__===Function.prototype);//true // Function.prototype(也是一个对象)的__proto__指向其构造函数Object的prototype console.log(Function.prototype.__proto__===Object.prototype);//true // 类似上面的 console.log(Fun.prototype.__proto__===Object.prototype);//true // Object作为一个构造函数,他的__proto__也是指向Function.prototype console.log(Object.__proto__===Function.prototype); // Object.prototype作为一切的源头,他的__proto__是null console.log(Object.prototype.__proto__===null);//true
constructor在原型链中,是作为对象prototypr的一个属性存在的,它指向构造函数
var obj = {} console.log(obj.__proto__===Function.prototype);//false console.log(obj.__proto__===Object.prototype);//true // obj的构造函数直接指向Object console.log(obj.__proto__.constructor===Object);//true // Object的__proto__指向Function的prototype console.log(obj.__proto__.constructor.__proto__===Function.prototype);//true // Function.prototype.__proto__指向Object的prototype console.log(obj.__proto__.constructor.__proto__.__proto__===Object.prototype);//true // Object.prototype.__proto__为空 console.log(obj.__proto__.constructor.__proto__.__proto__.__proto__===null);//true console.log(obj.__proto__.constructor.__proto__.__proto__.constructor.__proto__===Function.prototype);//true