摘要:創(chuàng)建對象字面量對象構(gòu)造函數(shù)字面量字面量構(gòu)造函數(shù)繼承原型鏈繼承在睡覺正在吃就是把實(shí)例賦值給,也就是說。構(gòu)造函數(shù)繼承在睡覺正在吃構(gòu)造函數(shù)繼承可以通過或方法實(shí)現(xiàn)繼承。
1.創(chuàng)建對象
1.字面量對象
2.構(gòu)造函數(shù)
3.Object.create
//1.字面量 var obj={ name: "字面量", show: function(){ console.log(this.name) } } //2.構(gòu)造函數(shù) function fun (name) { this.name=name } var obj=new fun("obj") //3.Object.create var obj={name: "obj"} var obj=Object.create(obj)2.JavaScript繼承 1.原型鏈繼承
function Parent(name){ this.name=name this.sleep=function(){ console.log(this.name + "在睡覺") } } Parent.prototype.eat=function(food){ console.log(this.name + "正在吃" + food) } function Child(){} Child.prototype=new Parent("Child") Child.prototype.constructor=Child var child=new Child()
Child.prototype=new Parent("Child")就是把Parent實(shí)例賦值給Child.prototype,也就是說new Child().__proto__===new Parent("Child")。
可以通過Child.prototype在原型對象上增加新的屬性或方法,也可以通過,child.__proto__在原型對象上添加新的方法和屬性。
缺點(diǎn):
1.原型對象上的屬性和方法是所有實(shí)例都可訪問的,而且一個(gè)實(shí)例改變了原型上的方法和屬性都會(huì)影響到其他實(shí)例。
2.創(chuàng)建子類實(shí)例時(shí),無法向父類構(gòu)造函數(shù)傳參。
function Parent(name){ this.name=name this.sleep=function(){ console.log(this.name + "在睡覺") } } Parent.prototype.eat=function(food){ console.log(this.name + "正在吃" + food) } function Child(){ Parent.call(this,"child") } Child.prototype.eyes=function(){console.log("eyes")} var child=new Child()
構(gòu)造函數(shù)繼承可以通過call或apply方法實(shí)現(xiàn)繼承。這種方法不能繼承原型對象中的屬性和方法,只能繼承實(shí)例屬性和實(shí)例方法,但是可以向父類傳參。
3.組合繼承function Parent(name){ this.name=name this.sleep=function(){ console.log(this.name + "正在睡覺") } } Parent.prototype.eat=function(food){ console.log(this.name + "正在吃" + food) } function Child(){ Parent.call(this,"child") } Child.prototype.eyes=function(){console.log("eyes")} Child.prototype=new Parent() Child.prototype.constructor=Child var child=new Child()
組合繼承是比較好的繼承, 他是原型鏈繼承和構(gòu)造函數(shù)繼承的結(jié)合, 合理的利用了這兩種組合的特點(diǎn),既是子類的實(shí)例,也是父類的實(shí)例, 但有一個(gè)缺點(diǎn)就是調(diào)用了兩次構(gòu)造函數(shù)。
4.組合繼承優(yōu)化function Parent(name){ this.name=name this.sleep=function(){ console.log(this.name + "正在睡覺") } } Parent.prototype.eat=function(food){ console.log(this.name + "正在吃" + food) } function Child(){ Parent.call(this,"child") } Child.prototype = Object.create(Parent.prototype) Child.prototype.constructor=Child var child=new Child()5.寄生組合繼承
function Parent(name){ this.name=name this.sleep=function(){ console.log(this.name + "正在睡覺") } } Parent.prototype.eat=function(food){ console.log(this.name + "正在吃" + food) } function Child(){ Parent.call(this,"child") } function f(){} f.prototype=Parent.prototype Child.prototype=new f() Child.prototype.constructor=Child var child=new Child()
只調(diào)用一次父類的構(gòu)造函數(shù),避免了在子類原型上創(chuàng)建不必要的,多余的屬性。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/97297.html
摘要:中繼承比較復(fù)雜,坑比較多,最近有點(diǎn)時(shí)間整理下,記錄下來。的繼承實(shí)現(xiàn)方式大概分類如下的兩大類,每一種實(shí)現(xiàn)都有自己的有點(diǎn)和缺點(diǎn),根據(jù)場景選擇吧通過修改原型鏈來來實(shí)現(xiàn)繼承通過復(fù)制父類來來實(shí)現(xiàn)繼承為了理解繼承的原型鏈的變化,我畫了原型鏈圖。 JS 中繼承比較復(fù)雜,坑比較多,最近有點(diǎn)時(shí)間整理下,記錄下來。 JS 的繼承實(shí)現(xiàn)方式大概分類如下的兩大類,每一種實(shí)現(xiàn)都有自己的有點(diǎn)和缺點(diǎn),根據(jù)場景選擇吧 ...
摘要:犯渾的地方中的原型繼承幾乎是面試必問點(diǎn),然而真正透徹的理解它還是需要費(fèi)一番功夫的,等等看到腦子就昏掉了,有時(shí)候以為自己掌握了,但是沒過多久看到角度不同的講解時(shí)就又犯糊涂了犯渾點(diǎn)中的構(gòu)造函數(shù),實(shí)例與原型之間的關(guān)系。 在javascirpt中,每個(gè)對象都有一個(gè)指向它的原型對象的內(nèi)部鏈接,這個(gè)原型對象又有自己的原型,一級(jí)一級(jí)鏈接上去,直到某個(gè)對象的原型為null,從而實(shí)現(xiàn)了繼承。 犯渾的地方...
摘要:缺點(diǎn)方法都在構(gòu)造函數(shù)中定義,每次創(chuàng)建實(shí)例都會(huì)創(chuàng)建一遍方法組合繼承組合繼承融合原型鏈繼承和構(gòu)造函數(shù)的優(yōu)點(diǎn),是中最常用的繼承模式然而組合繼承也有一個(gè)缺點(diǎn),就是會(huì)調(diào)用兩次父構(gòu)造函數(shù)。 1.前言 本文完整代碼指路我的GitHub,歡迎star。js中的繼承方式有很多種,以下僅列出部分。 2.原型鏈繼承 代碼如下: function Parent() { this.name = jche...
摘要:基于原型的繼承誠惶誠恐的寫下這篇文章。無論是還是,都是面向?qū)ο蟮?。將這個(gè)新對象作為構(gòu)造函數(shù)的執(zhí)行上下文其指向這個(gè)對象,并執(zhí)行構(gòu)造函數(shù)返回這個(gè)對象原型繼承我們來定義一個(gè)簡單的類和它的原型我們在原型上定義了一個(gè)方法。 源碼: https://github.com/RobinQu/Programing-In-Javascript/blob/master/chapters/JavaScr...
摘要:當(dāng)調(diào)用的構(gòu)造函數(shù)時(shí),在函數(shù)內(nèi)部又會(huì)調(diào)用的構(gòu)造函數(shù),又在新對象上創(chuàng)建了實(shí)例屬性和,于是這兩個(gè)屬性就屏蔽了原型中的同名屬性。 前言:這次對上篇收個(gè)尾,主要總結(jié)一下javascript的繼承。 1.原型鏈 js中原型鏈?zhǔn)菍?shí)現(xiàn)繼承的主要方法?;舅枷胧牵豪迷妥屢粋€(gè)引用類型繼承另一個(gè)引用類型的屬性和方法。我們來簡單回顧一下以前的內(nèi)容: 每個(gè)構(gòu)造函數(shù)都有一個(gè)原型對象 每個(gè)原型對象都包含一個(gè)指...
閱讀 2896·2021-11-17 09:33
閱讀 2292·2021-09-03 10:40
閱讀 603·2019-08-29 18:45
閱讀 3021·2019-08-29 16:21
閱讀 666·2019-08-29 11:11
閱讀 3451·2019-08-26 12:00
閱讀 3021·2019-08-23 18:19
閱讀 1152·2019-08-23 12:18