1. 程式人生 > 實用技巧 >prototype和__proto__的區別

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