成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript - 原型&原型鏈

wean / 1581人閱讀

摘要:可以看出,這個查找過程是一個鏈?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)降牟檎遥總€對象都有一個到它自身原型對象的鏈接,這些鏈接組件的整個鏈條就是原型鏈。

Object.prototype: 最頂層的原型對象,這個對象中保存了最常用的方法,如toString、valueOf、hasOwnProperty等,因此我們才能在任何對象中使用這些方法。

原型的構(gòu)建 字面量方式

當(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;  // true
Object.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

相關(guān)文章

  • 溫故js系列(15)-原型&原型&原型繼承

    摘要:給添加屬性給的原型對象添加屬性原型鏈在中,每個對象都有一個屬性,其保存著的地址就構(gòu)成了對象的原型鏈。實例變量實例函數(shù)原型鏈繼承有了原型鏈,就可以借助原型鏈實現(xiàn)繼承。是中唯一一個處理屬性但是不查找原型鏈的函數(shù)。 前端學(xué)習(xí):教程&開發(fā)模塊化/規(guī)范化/工程化/優(yōu)化&工具/調(diào)試&值得關(guān)注的博客/Git&面試-前端資源匯總 歡迎提issues斧正:原型&原型鏈&原型繼承 JavaScript-原...

    Ethan815 評論0 收藏0
  • 前端筆記——JS基礎(chǔ)(原型&&原型

    摘要:基礎(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...

    n7then 評論0 收藏0
  • 圖解javascript原型&原型

    我們在學(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)造...

    sutaking 評論0 收藏0
  • 深入JavaScript(一)this & Prototype

    摘要:然而事實上并不是。函數(shù)本身也是一個對象,但是給這個對象添加屬性并不能影響。一圖勝千言作者給出的解決方案,沒有麻煩的,沒有虛偽的,沒有混淆視線的,原型鏈連接不再赤裸裸。所以是這樣的一個函數(shù)以為構(gòu)造函數(shù),為原型。 注意:本文章是個人《You Don’t Know JS》的讀書筆記。在看backbone源碼的時候看到這么一小段,看上去很小,其實忽略了也沒有太大理解的問題。但是不知道為什么,我...

    The question 評論0 收藏0
  • 探索 proto & prototype 與繼承之間的關(guān)系

    摘要:而和的存在就是為了建立這種子類與父類間的聯(lián)系。創(chuàng)建一個基本對象建立新對象與原型我把它理解為類之間的連接執(zhí)行構(gòu)造函數(shù)小結(jié)可以理解為類,也就是存儲一類事物的基本信息。原型原型鏈和繼承之間的關(guān)系。 原型 原型的背景 首先,你應(yīng)該知道javascript是一門面向?qū)ο笳Z言。 是對象,就具有繼承性。 繼承性,就是子類自動共享父類的數(shù)據(jù)結(jié)構(gòu)和方法機制。 而prototype 和 __proto__...

    dockerclub 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<