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

相关