之前有說過繼承,在js中沒有類,所以在new的后面,放的是構造函數,在構造函數中有一個屬性prototype,js的繼承全靠它。
在js中對象的類型有很多,常見的就是普通對象,和函數對象,在對象中都會有一個屬性叫_proto_,這個屬性對應着相應的對象原型。
這里補充一下對象還有一個屬性是,constructor.這個屬性對應創建所有指向該原型的實例的構造函數。(換個說法,他是一個指針,指向構造函數);
prototype這個屬性,在構造函數創建被new出來的時候,prototype將作為原型值,賦值給其他所有對象的實例。所以解決了構造函數不能實例共享的麻煩。(這里我在我的js繼承里有說過,不懂得可以去看一下。)
總結一下就是。每個對象都有一個屬性就是 _proto_ 。函數對象不僅有_proto_屬性,還有prototype屬性,函數的prototype作為屬性值作為原型值,賦值給所有的實例對象;
也就是賦值_proto_.
簡單的個案例解釋一下:
function d(name){
this.name = name;
}
var a = new d('haha');
這里new 的一個過程,
1、var a= {};初始化一個對象a;
2、a._proto_ = d.prototype; 將對象p的 __proto__ 屬性設置為 d.prototype;
3、d.call(p,”張三”,20);調用構造函數d來初始化p。關於call/apply使用
這里說簡單說一下call和apply的使用,他是用來重定向this指向的。(詳細理解可以去看這個: https://www.cnblogs.com/Shd-Study/p/6560808.html )
這里還有一點,就是我們打印a._proto_ = d.prototype; 打印結果都是為true;
在這里我們想要更好的理解_proto_和constructor.這倆個屬性,我們可以打印出來看一下
在圖中我們可以看到對象的倆個屬性。
這個告訴我們constructor這個就是指向的構造函數
這個里面的等式,是不是有着什么樣的關系。前面我們也說過,構造函數的過程里面有着這樣的一部就是,把d.prototype賦值給這邊f1._proto_;
今天我們就先說這么多,下次接着說!
分割線-------------------------------------------------------------------------------------------
接着上次說
比如當我們訪問
a.show()這個方法的時候。我們可以發現,其實a是沒有這個方法的。那么a就是向他的實例上去找。就是d。而這時候我們可以看到其實d也沒有show這個方法。
那怎么辦,這時候會向d的上一級去找就是object.prototype。有人要問這個是什么啊。這個是總的對象原型。什么意思呢。就是所有的對象的原型。所有對象最后都指向這個。
但是我們都找到最后都找不到這個方法了,那沒辦法了,只能告訴他是null了。這一個過程就是原型鏈
可以得到一個等式
a._proto_._proto_ ._proto_ == null //true
還有上次我們說過constructor他是指向我們的構造函數,也就是實例d
我們可以思考一下constructor這個方法是哪來的。為啥會有這個方法
其實這也就是繼承,繼承object.prototype而來的