摘要:在默認(rèn)情況下,原型對(duì)象都會(huì)自動(dòng)獲得一個(gè)構(gòu)造函數(shù)屬性,這個(gè)屬性包含包含一個(gè)指向?qū)傩运诤瘮?shù)的指針。此外這里被重寫了,指向了看圖這個(gè)搜索的過程搜索實(shí)例搜索搜索搜索總是一步步向前到原型鏈末端停止
《JavaScript高級(jí)程序設(shè)計(jì) 第三版》 學(xué)習(xí)筆記
Object-Oriented 有一個(gè)標(biāo)志,就是都有類的概念,通過類來創(chuàng)建多個(gè)具有相同屬性和方法的對(duì)象。而對(duì)于 EMCAScript中沒有類的概念,ECMA-262把對(duì)象定義為
”無序?qū)傩缘募希搶傩钥梢园魏位局担瑢?duì)象或者函數(shù)。“
每個(gè)函數(shù)都有一個(gè)prototype(原型)屬性
這個(gè)屬性都有一個(gè)指針,指向一個(gè)對(duì)象
這個(gè)對(duì)象包含由特定類型所有實(shí)例共享的屬性和方法
使用原型的好處是 可以讓所有對(duì)象實(shí)例共享它包含的方法和屬性
通過in操作符和hasOwnProperty來判斷給定屬性是來自于原型還是實(shí)例
in- true 代表屬性在對(duì)象中存在 來自實(shí)例或者來自原型
hasOwnProperty- true代表屬性來自于實(shí)例 是實(shí)例屬性
ECMAScript中只支持實(shí)現(xiàn)繼承,而且是通過原型鏈的方式來實(shí)現(xiàn)的
理解原型對(duì)象
是這樣的
當(dāng)我們創(chuàng)建一個(gè)新函數(shù)的時(shí)候,會(huì)根據(jù)一組特定的規(guī)則為該函數(shù)創(chuàng)建一個(gè)prototype屬性,這個(gè)prototype屬性指向函數(shù)的原型對(duì)象。在默認(rèn)情況下,原型對(duì)象都會(huì)自動(dòng)獲得一個(gè)constructor(構(gòu)造函數(shù))屬性,這個(gè)屬性包含包含一個(gè)指向prototype屬性所在函數(shù)的指針。
所以關(guān)系就是
比如有一個(gè)Person的對(duì)象
Person.prototype => 原型對(duì)象
原型對(duì)象.constructor => Person
即 Person.prototype.constructor == Person
見下圖關(guān)系
將原型鏈作為實(shí)現(xiàn)繼承的主要方法,基本思想是利用原型讓一個(gè)引用類型繼承另一個(gè)引用類型的屬性和方法。
demo代碼
function SuperType(){ this.property = true; } SuperType.prototype.getSuperValue = function(){ return this.property; } function SubType(){ this.subproperty = false; } //SubType.prototype = new SuperType(); SubType.prototype.getSubValue = function(){ return this.subproperty; } // 繼承SuperType 就指向了SuperType的原型對(duì)象了 SubType.prototype = new SuperType(); var instance = new SubType(); alert(instance.getSuperValue()); // true alert(instance.property); //true
如果把SubType中的subproperty改成property會(huì)是怎么樣呢 都會(huì)變成false
demo圖解
備注:
之所以 SuperType中property屬性會(huì)出現(xiàn)在,SubType.prototype中,是因?yàn)閜roperty是一個(gè)實(shí)例屬性,而SubType.prototype是SuperType的一個(gè)實(shí)例對(duì)象,所以property屬性會(huì)出現(xiàn)在SubType.prototype中,但是這個(gè)property相對(duì)于instance(SubType的一個(gè)實(shí)例)卻又是一個(gè)原型屬性,所以如果將subproperty換成property的話,在return this.property時(shí),優(yōu)先找到實(shí)例屬性中有這么一個(gè)屬性,就會(huì)返回實(shí)例屬性。
此外這里SubType.prototype.constructor 被重寫了,instance.constructor指向了SuperType 看圖
instance.getSuperValue() 這個(gè)搜索的過程
1) 搜索實(shí)例
2) 搜索SubType.prototype
3) 搜索SuperType.prototype
搜索總是一步步向前到原型鏈末端停止(Object)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/85996.html
摘要:首先,需要來理清一些基礎(chǔ)的計(jì)算機(jī)編程概念編程哲學(xué)與設(shè)計(jì)模式計(jì)算機(jī)編程理念源自于對(duì)現(xiàn)實(shí)抽象的哲學(xué)思考,面向?qū)ο缶幊淌瞧湟环N思維方式,與它并駕齊驅(qū)的是另外兩種思路過程式和函數(shù)式編程。 JavaScript 中的原型機(jī)制一直以來都被眾多開發(fā)者(包括本人)低估甚至忽視了,這是因?yàn)榻^大多數(shù)人沒有想要深刻理解這個(gè)機(jī)制的內(nèi)涵,以及越來越多的開發(fā)者缺乏計(jì)算機(jī)編程相關(guān)的基礎(chǔ)知識(shí)。對(duì)于這樣的開發(fā)者來說 J...
摘要:我們有了構(gòu)造函數(shù)之后,第二步開始使用它構(gòu)造一個(gè)函數(shù)。來個(gè)例子這種方式很簡單也很直接,你在構(gòu)造函數(shù)的原型上定義方法,那么用該構(gòu)造函數(shù)實(shí)例化出來的對(duì)象都可以通過原型繼承鏈訪問到定義在構(gòu)造函數(shù)原型上的方法。 來源: 個(gè)人博客 白話解釋 Javascript 原型繼承(prototype inheritance) 什么是繼承? 學(xué)過面向?qū)ο蟮耐瑢W(xué)們是否還記得,老師整天掛在嘴邊的面向?qū)ο笕筇?..
摘要:這正是我們想要的太棒了毫不意外的,這種繼承的方式被稱為構(gòu)造函數(shù)繼承,在中是一種關(guān)鍵的實(shí)現(xiàn)的繼承方法,相信你已經(jīng)很好的掌握了。 你應(yīng)該知道,JavaScript是一門基于原型鏈的語言,而我們今天的主題 -- 繼承就和原型鏈這一概念息息相關(guān)。甚至可以說,所謂的原型鏈就是一條繼承鏈。有些困惑了嗎?接著看下去吧。 一、構(gòu)造函數(shù),原型屬性與實(shí)例對(duì)象 要搞清楚如何在JavaScript中實(shí)現(xiàn)繼承,...
摘要:使用構(gòu)造函數(shù)的原型繼承相比使用原型的原型繼承更加復(fù)雜,我們先看看使用原型的原型繼承上面的代碼很容易理解。相反的,使用構(gòu)造函數(shù)的原型繼承像下面這樣當(dāng)然,構(gòu)造函數(shù)的方式更簡單。 五天之前我寫了一個(gè)關(guān)于ES6標(biāo)準(zhǔn)中Class的文章。在里面我介紹了如何用現(xiàn)有的Javascript來模擬類并且介紹了ES6中類的用法,其實(shí)它只是一個(gè)語法糖。感謝Om Shakar以及Javascript Room中...
摘要:繼承簡介在的中的面向?qū)ο缶幊蹋^承是給構(gòu)造函數(shù)之間建立關(guān)系非常重要的方式,根據(jù)原型鏈的特點(diǎn),其實(shí)繼承就是更改原本默認(rèn)的原型鏈,形成新的原型鏈的過程。 showImg(https://segmentfault.com/img/remote/1460000018998684); 閱讀原文 前言 JavaScript 原本不是純粹的 OOP 語言,因?yàn)樵?ES5 規(guī)范中沒有類的概念,在 ...
摘要:的繼承方式屬于原型式繼承,非常靈活。當(dāng)使用關(guān)鍵字執(zhí)行類的構(gòu)造函數(shù)時(shí),系統(tǒng)首先創(chuàng)建一個(gè)新對(duì)象,這個(gè)對(duì)象會(huì)繼承自構(gòu)造函數(shù)的原型對(duì)象新對(duì)象的原型就是構(gòu)造函數(shù)的屬性。也就是說,構(gòu)造函數(shù)用來對(duì)生成的新對(duì)象進(jìn)行一些處理,使這個(gè)新對(duì)象具有某些特定的屬性。 繼承這個(gè)東西在Javascript中尤其復(fù)雜,我掌握得也不好,找工作面試的時(shí)候在這個(gè)問題上栽過跟頭。Javascript的繼承方式屬于原型式繼承,...
閱讀 992·2021-11-04 16:08
閱讀 2967·2021-09-13 10:37
閱讀 504·2019-08-30 15:56
閱讀 1952·2019-08-30 15:55
閱讀 2235·2019-08-30 15:53
閱讀 2078·2019-08-30 13:13
閱讀 2918·2019-08-30 12:51
閱讀 1540·2019-08-29 16:06