摘要:可以看出,這個查找過程是一個鏈?zhǔn)降牟檎?,每個對象都有一個到它自身原型對象的鏈接,這些鏈接組件的整個鏈條就是原型鏈。原型的構(gòu)建字面量方式當(dāng)通過字面量方式創(chuàng)建對象時,它的原型就是。
面向?qū)ο?/b>
JavaScript沒有類(class)的概念的(ES6 中的class也只不過是語法糖,并非真正意義上的類),而在JavaScript中,在 JavaScript 中,除了 String, Number, Boolean Undefined, Null, Symbol 這 6 種基本類型外,其他所有數(shù)據(jù)都是 Object 類型。
在基于類的傳統(tǒng)面向?qū)ο蟮木幊陶Z言中,對象由類實例化而來,實例化的過程中,類的屬性和方法會拷貝到這個對象中;對象的繼承實際上是類的繼承,在定義子類繼承于父類時,子類會將父類的屬性和方法拷貝到自身當(dāng)中。因此,這類語言中,對象創(chuàng)建和繼承行為都是通過拷貝完成的。但在JavaScript中,對象的創(chuàng)建、對象的繼承是不存在拷貝行為的。
原型和原型鏈原型是為了共享多個對象之間的一些共有特性(屬性或方法),這個功能也是任何一門面向?qū)ο蟮木幊陶Z言必須具備的。A、B兩個對象的原型相同,那么它們必然有一些相同的特征。
JavaScript中的對象,都有一個內(nèi)置屬性[Prototype],指向這個對象的原型對象。當(dāng)查找一個屬性或方法時,如果在當(dāng)前對象中找不到定義,會繼續(xù)在當(dāng)前對象的原型對象中查找;如果原型對象中依然沒有找到,會繼續(xù)在原型對象的原型中查找;如此繼續(xù),直到找到為止,或者查找到最頂層的原型對象中也沒有找到(Object.prototype),就結(jié)束查找,返回undefined??梢钥闯?,這個查找過程是一個鏈?zhǔn)降牟檎遥總€對象都有一個到它自身原型對象的鏈接,這些鏈接組件的整個鏈條就是原型鏈。
原型的構(gòu)建 字面量方式Object.prototype: 最頂層的原型對象,這個對象中保存了最常用的方法,如toString、valueOf、hasOwnProperty等,因此我們才能在任何對象中使用這些方法。
當(dāng)通過字面量方式創(chuàng)建對象時,它的原型就是Object.prototype。雖然我們無法直接訪問內(nèi)置屬性[[Prototype]],但我們可以通過Object.getPrototypeOf()或?qū)ο蟮?b>__proto__獲取對象的原型。
let obj = {}; Object.getPrototypeOf(obj) === Object.prototype; // true (obj).__proto__ === Object.prototype; // true函數(shù)的構(gòu)造調(diào)用
通過函數(shù)的構(gòu)造調(diào)用(注意,我們不把它叫做構(gòu)造函數(shù),因為JavaScript中同樣沒有構(gòu)造函數(shù)的概念,所有的函數(shù)都是平等的,只不過用來創(chuàng)建對象時,函數(shù)的調(diào)用方式不同而已)也是一種常用的創(chuàng)建對象的方式。基于同一個函數(shù)創(chuàng)建出來的對象,理應(yīng)可以共享一些相同的屬性或方法,但這些屬性或方法如果放在Object.prototype里,那么所有的對象都可以使用它們了,作用域太大,顯然不合適。于是,JavaScript在定義一個函數(shù)時,同時為這個函數(shù)定義了一個 默認的prototype屬性,所有共享的屬性或方法,都放到這個屬性所指向的對象中。由此看出,?通過一個函數(shù)的構(gòu)造調(diào)用創(chuàng)建的對象,它的原型就是這個函數(shù)的prototype指向的對象。
let f = function(name) { this.name = name }; f.prototype.getName = function() { return this.name; }; let obj = new f("123"); obj.getName(); // 123 obj.__proto__ === f.prototype; // trueObject.create()
第三種常用的創(chuàng)建對象的方式是使用Object.create()。?這個方法會以你傳入的對象作為創(chuàng)建出來的對象的原型。
let obj = {}; let obj2 = Object.create(obj); obj2.__proto__ === obj; // true
這種方式還可以模擬對象的“繼承”行為。
function Foo(name) { this.name = name; } Foo.prototype.myName = function() { return this.name; }; function Bar (name,label) { Foo.call( this, name ); // this.label = label; } let temp = Object.create( Foo.prototype ); Bar.prototype = temp; Bar.prototype.myLabel = function() { return this.label; }; let a = new Bar( "a", "obj a" ); a.myName(); // "a" a.myLabel(); // "obj a" a.__proto__.__proto__ === Foo.prototype; //true?__proto__和prototype
__proto__指向當(dāng)前對象的原型,prototype是函數(shù)才具有的屬性,默認情況下,new 一個函數(shù)創(chuàng)建出的對象,其原型都指向這個函數(shù)的prototype屬性。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/84862.html
摘要:給添加屬性給的原型對象添加屬性原型鏈在中,每個對象都有一個屬性,其保存著的地址就構(gòu)成了對象的原型鏈。實例變量實例函數(shù)原型鏈繼承有了原型鏈,就可以借助原型鏈實現(xiàn)繼承。是中唯一一個處理屬性但是不查找原型鏈的函數(shù)。 前端學(xué)習(xí):教程&開發(fā)模塊化/規(guī)范化/工程化/優(yōu)化&工具/調(diào)試&值得關(guān)注的博客/Git&面試-前端資源匯總 歡迎提issues斧正:原型&原型鏈&原型繼承 JavaScript-原...
摘要:基礎(chǔ)原型原型鏈構(gòu)造函數(shù)默認有這一行張三李四構(gòu)造函數(shù)擴展其實是的語法糖其實是的語法糖其實是使用判斷一個函數(shù)是否是一個變量的構(gòu)造函數(shù)原型規(guī)則和示例所有的引用類型數(shù)組對象函數(shù),都具有對象屬性即可自有擴展的屬性,除外所有的引用類型數(shù)組對象函數(shù), JavaScript基礎(chǔ) —— 原型&&原型鏈 構(gòu)造函數(shù) function Foo(name, age) { this.name = na...
我們在學(xué)習(xí)javascript時,經(jīng)常會聽到萬物皆對象,但是呢,其實萬物皆對象的對象也有區(qū)別。分為普通對象和函數(shù)對象。1.對象分為函數(shù)對象和普通對象? ??通過new Function()創(chuàng)建的對象都是函數(shù)對象,其他的都是普通對象。showImg(https://segmentfault.com/img/bVbtWre?w=526&h=252); 2.構(gòu)造函數(shù)而提到new關(guān)鍵字,我們不得不提到構(gòu)造...
摘要:然而事實上并不是。函數(shù)本身也是一個對象,但是給這個對象添加屬性并不能影響。一圖勝千言作者給出的解決方案,沒有麻煩的,沒有虛偽的,沒有混淆視線的,原型鏈連接不再赤裸裸。所以是這樣的一個函數(shù)以為構(gòu)造函數(shù),為原型。 注意:本文章是個人《You Don’t Know JS》的讀書筆記。在看backbone源碼的時候看到這么一小段,看上去很小,其實忽略了也沒有太大理解的問題。但是不知道為什么,我...
摘要:而和的存在就是為了建立這種子類與父類間的聯(lián)系。創(chuàng)建一個基本對象建立新對象與原型我把它理解為類之間的連接執(zhí)行構(gòu)造函數(shù)小結(jié)可以理解為類,也就是存儲一類事物的基本信息。原型原型鏈和繼承之間的關(guān)系。 原型 原型的背景 首先,你應(yīng)該知道javascript是一門面向?qū)ο笳Z言。 是對象,就具有繼承性。 繼承性,就是子類自動共享父類的數(shù)據(jù)結(jié)構(gòu)和方法機制。 而prototype 和 __proto__...
閱讀 1565·2023-04-26 00:20
閱讀 1165·2023-04-25 21:49
閱讀 835·2021-09-22 15:52
閱讀 609·2021-09-07 10:16
閱讀 1002·2021-08-18 10:22
閱讀 2696·2019-08-30 14:07
閱讀 2267·2019-08-30 14:00
閱讀 2690·2019-08-30 13:00