2 回答

TA貢獻2021條經驗 獲得超8個贊
構造函數中,有個__proto__屬性,里面指向的是原型。
首先,構造函數的自有屬性里,沒有 __proto__
屬性,你看到的可能是構造函數的原型鏈加粗文字上的,或者是實例的__proto__
屬性;
其次,構造函數中訪問它對應的原型對象,用 prototype
屬性,原型對象上有 constructor
屬性指向構造函數,構造函數和原型對象互相關聯;
那么是不是就說明原型是存在于構造函數中的,屬于構造函數的一個屬性?
prototype
是存在于構造函數中的,屬于構造函數的一個屬性。原型是一個對象,構造函數的prototype
指向這個對象。
還是說,prototype原型不是屬于構造函數的,而__proto__只是指路人而已?
指路人說法不準確,prototype
僅僅是構造函數的屬性,是一個引用,指向內存里的 prototype
對象;__proto__
在實例上,作為實例的屬性,是一個引用,指向內存里的 prototype
對象
題外話
1、__proto__
不建議使用,可以用 Object.getPrototypeOf()
和 Object.setPrototypeOf()
代替;
2、原型建議看經典書籍吧,書上說的嚴謹清楚些;
3、你的基本概念有些混亂,還是看經典書籍吧
JavaScript權威指南-第6版-中
JavaScript高級程序設計-第3版-中

TA貢獻2011條經驗 獲得超2個贊
當你定義一個(構造)函數的時候,伴隨這這個函數的定義,這個函數自然具有一個prototype屬性,這個屬性指向一個對象,我們把它稱作函數的原型對象吧,這個原型對象中有一個屬性constructor指向了這個函數。
可以認為定義構造函數<F>的同時也生成了一個對象<O>,構造函數<F>用prototype屬性指向<O>,<O>用constructor屬性指向<F>,它們就綁在了一起。
function F(){};
console.log(F === F.prototype.constructor); // true
上面說的和__proto__還沒有關系,它是在用構造函數生成的實例上的。當我們用構造函數生成一個實例時<R>,這個實例有一個屬性__proto__指向了那個原型對象<O>。
var R = new F();
console.log(R.__proto__ === F.prototype); // true
現在我們來看構造函數<F>、原型對象<O>、實例對象<R>: <F>用prototype屬性指向<O>, <R>用__proto__屬性指向<O>, 而<O>用constructor屬性指向<F>。如果你畫個圖就更清晰了。
另外說以下,要通過實例對象來獲得它的原型對象,__proto__
并太好,由于瀏覽器大多支持,因此es6
中也寫入了標準,但是從它的寫法就看出它更多地是一個內部的屬性,實際代碼中可以用Object.getPrototypeOf()
方法,傳入一個實例對象,就可以獲得它的原型對象。
添加回答
舉報