prototype和__proto__的區別
阿新 • • 發佈:2020-09-20
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