js原型、原型鏈


之前有說過繼承,在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而來的

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM