摘要:基本類型引用類型原型構(gòu)造函數(shù)上有屬性,為原型對(duì)象為實(shí)例對(duì)象,每個(gè)對(duì)象上都有,而指向的是原型對(duì)象,而原型對(duì)象上有屬性,指向的是上一級(jí)的原型對(duì)象。
基本類型
String ,null,undefined,number,boolean
引用類型:
object
原型:
function People(name,sex){ this.name=name; this.sex=sex; }
people構(gòu)造函數(shù)上有屬性prototype,prototype為原型對(duì)象;
var p1=new People("canoe","girl");
p1為People實(shí)例對(duì)象,每個(gè)對(duì)象上都有__proto__,而__proto__指向的是原型對(duì)象,而原型對(duì)象上有__proto__屬性,指向的是上一級(jí)的原型對(duì)象。就這么依次向上查找,直到null
各種繼承,優(yōu)缺點(diǎn):
1.原型鏈繼承
// 定義一個(gè)動(dòng)物類 function Animal (name) { // 屬性 this.name = name || "Animal"; // 實(shí)例方法 this.sleep = function(){ console.log(this.name + "正在睡覺!"); } } // 原型方法 Animal.prototype.eat = function(food) { console.log(this.name + "正在吃:" + food); };
核心: 將父類的實(shí)例作為子類的原型
function Cat(){ } Cat.prototype = new Animal(); Cat.prototype.name = "cat"; // Test Code var cat = new Cat(); console.log(cat.name); console.log(cat.eat("fish")); console.log(cat.sleep()); console.log(cat instanceof Animal); //true console.log(cat instanceof Cat); //true
優(yōu)點(diǎn):
子類的原型是父類的實(shí)例,關(guān)系簡(jiǎn)單
父類新增原型方法/原型屬性,子類都能訪問到
簡(jiǎn)單,易于實(shí)現(xiàn)
缺點(diǎn):
要想為子類新增屬性和方法,必須要在new Animal()這樣的語(yǔ)句之后執(zhí)行,不能放到構(gòu)造器中
無(wú)法實(shí)現(xiàn)多繼承
來(lái)自原型對(duì)象的引用屬性是所有實(shí)例共享的
創(chuàng)建子類實(shí)例時(shí),無(wú)法向父類構(gòu)造函數(shù)傳參
2.構(gòu)造繼承
核心:使用父類的構(gòu)造函數(shù)來(lái)增強(qiáng)子類實(shí)例,等于是復(fù)制父類的實(shí)例屬性給子類(沒用到原型)
function Cat(name){ Animal.call(this); this.name = name || "Tom"; } // Test Code var cat = new Cat(); console.log(cat.name); console.log(cat.sleep()); console.log(cat instanceof Animal); // false console.log(cat instanceof Cat); // true
優(yōu)點(diǎn):
創(chuàng)建子類實(shí)例時(shí),可以向父類傳遞參數(shù)
可以實(shí)現(xiàn)多繼承(call多個(gè)父類對(duì)象)
缺點(diǎn):
實(shí)例并不是父類的實(shí)例,只是子類的實(shí)例
只能繼承父類的實(shí)例屬性和方法,不能繼承原型屬性/方法
無(wú)法實(shí)現(xiàn)函數(shù)復(fù)用,每個(gè)子類都有父類實(shí)例函數(shù)的副本,影響性能
3、實(shí)例繼承
function Cat(name){ var instance=new Animal(); instance.name=name||"tom"; return instance } // Test Code var cat = new Cat(); console.log(cat.name); console.log(cat.sleep()); console.log(cat instanceof Animal); // true console.log(cat instanceof Cat); // false
優(yōu)點(diǎn):
不限制調(diào)用方式,不管是new 子類()還是子類(),返回的對(duì)象具有相同的效果
缺點(diǎn):
實(shí)例是父類的實(shí)例,不是子類的實(shí)例
不支持多繼承
4、組合繼承
function Cat(name){ Animal.call(this); this.name = name || "Tom"; } Cat.prototype = new Animal(); Cat.prototype.constructor=Cat; // Test Code var cat = new Cat(); console.log(cat.name); console.log(cat.sleep()); console.log(cat instanceof Animal); // true console.log(cat instanceof Cat); // true
優(yōu)點(diǎn):
彌補(bǔ)了方式2的缺陷,可以繼承實(shí)例屬性/方法,也可以繼承原型屬性/方法
既是子類的實(shí)例,也是父類的實(shí)例
不存在引用屬性共享問題
可傳參
函數(shù)可復(fù)用
缺點(diǎn):
調(diào)用了兩次父類構(gòu)造函數(shù),生成了兩份實(shí)例(子類實(shí)例將子類原型上的那份屏蔽了)
5、寄生組合繼承
核心:通過寄生方式,砍掉父類的實(shí)例屬性,這樣,在調(diào)用兩次父類的構(gòu)造的時(shí)候,就不會(huì)初始化兩次實(shí)例方法/屬性,避免的組合繼承的缺點(diǎn)
function Cat(name){ Animal.call(this); this.name = name || "Tom"; } (function(){ // 創(chuàng)建一個(gè)沒有實(shí)例方法的類 var Super = function(){}; Super.prototype = Animal.prototype; //將實(shí)例作為子類的原型 Cat.prototype = new Super(); })(); // Test Code var cat = new Cat(); console.log(cat.name); console.log(cat.sleep()); console.log(cat instanceof Animal); // true console.log(cat instanceof Cat); //true
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/93126.html
摘要:是文檔的一種表示結(jié)構(gòu)。這些任務(wù)大部分都是基于它。這個(gè)實(shí)踐的重點(diǎn)是把你在前端練級(jí)攻略第部分中學(xué)到的一些東西和結(jié)合起來(lái)。一旦你進(jìn)入框架部分,你將更好地理解并使用它們。到目前為止,你一直在使用進(jìn)行操作。它是在前端系統(tǒng)像今天這樣復(fù)雜之前編寫的。 本文是 前端練級(jí)攻略 第二部分,第一部分請(qǐng)看下面: 前端練級(jí)攻略(第一部分) 在第二部分,我們將重點(diǎn)學(xué)習(xí) JavaScript 作為一種獨(dú)立的語(yǔ)言,如...
摘要:匿名函數(shù)的執(zhí)行環(huán)境具有全局性,因此它的對(duì)象通常指向。如果對(duì)此有疑惑,可以看知乎上的答案知乎匿名函數(shù)的指向?yàn)槭裁词亲鳛閷?duì)象方法的調(diào)用,指向該對(duì)象當(dāng)函數(shù)作為某個(gè)對(duì)象的方法調(diào)用時(shí),就指這個(gè)函數(shù)所在的對(duì)象。 因?yàn)槿粘9ぷ髦薪?jīng)常使用到this,而且在JavaScript中this的指向問題也很容易讓人混淆一部分知識(shí)。 這段時(shí)間翻閱了一些書籍也查閱了網(wǎng)上一些資料然后結(jié)合自己的經(jīng)驗(yàn),為了能讓自...
摘要:由于系統(tǒng)變得越來(lái)越復(fù)雜,人們提出了稱為預(yù)處理器和后處理器的工具來(lái)管理復(fù)雜性。后處理器在由預(yù)處理器手寫或編譯后對(duì)應(yīng)用更改。我之前建議的文章,,也涵蓋了預(yù)處理器相關(guān)的知識(shí)。 譯者:前端小智 原文:medium.freecodecamp.org/from-zero-t… medium.freecodecamp.org/from-zero-t… 我記得我剛開始學(xué)習(xí)前端開發(fā)的時(shí)候。我看到了很多文章及...
摘要:一般來(lái)說,聲明式編程關(guān)注于發(fā)生了啥,而命令式則同時(shí)關(guān)注與咋發(fā)生的。聲明式編程可以較好地解決這個(gè)問題,剛才提到的比較麻煩的元素選擇這個(gè)動(dòng)作可以交托給框架或者庫(kù)區(qū)處理,這樣就能讓開發(fā)者專注于發(fā)生了啥,這里推薦一波與。 本文翻譯自FreeCodeCamp的from-zero-to-front-end-hero-part。 繼續(xù)譯者的廢話,這篇文章是前端攻略-從路人甲到英雄無(wú)敵的下半部分,在...
摘要:設(shè)計(jì)模式是以面向?qū)ο缶幊虨榛A(chǔ)的,的面向?qū)ο缶幊毯蛡鹘y(tǒng)的的面向?qū)ο缶幊逃行┎顒e,這讓我一開始接觸的時(shí)候感到十分痛苦,但是這只能靠自己慢慢積累慢慢思考。想繼續(xù)了解設(shè)計(jì)模式必須要先搞懂面向?qū)ο缶幊蹋駝t只會(huì)讓你自己更痛苦。 JavaScript 中的構(gòu)造函數(shù) 學(xué)習(xí)總結(jié)。知識(shí)只有分享才有存在的意義。 是時(shí)候替換你的 for 循環(huán)大法了~ 《小分享》JavaScript中數(shù)組的那些迭代方法~ ...
摘要:要理解立即執(zhí)行函數(shù),需要先理解一些函數(shù)的基本概念。函數(shù)表達(dá)式使用關(guān)鍵字聲明一個(gè)函數(shù),但未給函數(shù)命名,最后將匿名函數(shù)賦予一個(gè)變量,叫函數(shù)表達(dá)式,這是最常見的函數(shù)表達(dá)式語(yǔ)法形式。 javascript和其他編程語(yǔ)言相比比較隨意,所以javascript代碼中充滿各種奇葩的寫法,有時(shí)霧里看花,當(dāng)然,能理解各型各色的寫法也是對(duì)javascript語(yǔ)言特性更進(jìn)一步的深入理解。 ( functio...
閱讀 1386·2021-10-19 11:42
閱讀 726·2021-09-22 16:04
閱讀 1878·2021-09-10 11:23
閱讀 1855·2021-07-29 14:48
閱讀 1256·2021-07-26 23:38
閱讀 2819·2019-08-30 15:54
閱讀 1032·2019-08-30 11:25
閱讀 1702·2019-08-29 17:23