摘要:組合繼承法把父對(duì)象方法掛載到父類(lèi)的原型對(duì)象上去,實(shí)現(xiàn)方法復(fù)用原型的構(gòu)造函數(shù)指向程序員
原型繼承
function Person(name,sex){ this.name=name; this.sex=sex; this.friends = {lily:"female",lucy:"female"}; this.showFriends=function(){ var str = "" for(i in this.friends){ str+=i +" "+this.friends[i] +","; } console.log("my friends:"+str); } } Person.prototype.hello=function(){ console.log("hello:"+this.name); } var per1 = new Person("A","male"); per1.hello(); per1.showFriends(); function Student(className){ this.class = className; } Student.prototype = new Person("B","male");//原型繼承將子對(duì)象的原型對(duì)象指向父對(duì)象的實(shí)例 ; 缺點(diǎn):不能由子對(duì)象像父對(duì)象傳遞參數(shù), var stu1 = new Student(1);//不能由子對(duì)象像父對(duì)象傳遞參數(shù), stu1.name="C"; stu1.hello(); stu1.friends.C = "male";//2、對(duì)于引用型的屬性修改之后會(huì)印象其他的實(shí)例對(duì)象; stu1.showFriends();//2、對(duì)于引用型的屬性修改之后會(huì)印象其他的實(shí)例對(duì)象; console.log("stu1 instanceof Student: "); console.log(stu1 instanceof Student); console.log("stu1 instanceof Person: "); console.log(stu1 instanceof Person); var stu2 = new Student(2); stu2.name="D"; stu2.hello(); stu2.showFriends();//2、對(duì)于引用型的屬性修改之后會(huì)印象其他的實(shí)例對(duì)象; console.log("stu2 instanceof Student: "); console.log(stu2 instanceof Student); console.log("stu2 instanceof Person: "); console.log(stu2 instanceof Person);
缺點(diǎn):1、不能由子對(duì)象像父對(duì)象傳遞參數(shù),2、對(duì)于引用型的屬性修改之后會(huì)印象其他的實(shí)例對(duì)象;構(gòu)造函數(shù)繼承
//構(gòu)造函數(shù)繼承 function Teacher(name,sex,type){ this.type=type; Person.call(this,name,sex); } var tea1 = new Teacher("E","female","數(shù)學(xué)"); //tea1.hello(); //報(bào)錯(cuò)沒(méi)有繼承到原型上的方法 tea1.friends.F = "male"; tea1.showFriends(); var tea2 = new Teacher("G","male","語(yǔ)文"); tea2.friends.H = "male"; tea2.showFriends(); console.log("tea2 instanceof Teacher: ") console.log(tea2 instanceof Teacher); console.log("tea2 instanceof Person: ") console.log(tea2 instanceof Person);
缺點(diǎn):1、不能繼承父對(duì)象原型上的方法 2、每次實(shí)例化對(duì)象會(huì)重新構(gòu)建函數(shù),浪費(fèi)內(nèi)存。組合繼承法
把父對(duì)象方法掛載到父類(lèi)的原型對(duì)象上去,實(shí)現(xiàn)方法復(fù)用
function Worker(name,sex,job){ this.job = job; Person.call(this,name,sex) } Worker.prototype = new Person(); Worker.prototype.constructor = Worker;//原型的構(gòu)造函數(shù)指向worker var wor1 = new Worker("I","female","程序員"); wor1.hello(); wor1.friends.J = "male"; wor1.showFriends();
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/102277.html
摘要:因?yàn)檫@造成了繼承鏈的紊亂,因?yàn)榈膶?shí)例是由構(gòu)造函數(shù)創(chuàng)建的,現(xiàn)在其屬性卻指向了為了避免這一現(xiàn)象,就必須在替換對(duì)象之后,為新的對(duì)象加上屬性,使其指向原來(lái)的構(gòu)造函數(shù)。這個(gè)函數(shù)接收兩個(gè)參數(shù)子類(lèi)型構(gòu)造函數(shù)和超類(lèi)型構(gòu)造函數(shù)。 最近一直在研究js面向?qū)ο螅玩溊^承是一個(gè)難點(diǎn),下面是我對(duì)繼承的理解以下文章借鑒自CSDN季詩(shī)筱的博客 原型鏈繼承的基本概念: ES中描述了原型鏈的概念,并將原型鏈作為實(shí)現(xiàn)...
摘要:創(chuàng)建自定義的構(gòu)造函數(shù)之后,其原型對(duì)象只會(huì)取得屬性,其他方法都是從繼承來(lái)的。優(yōu)缺點(diǎn)寄生式繼承在主要考慮對(duì)象而不是創(chuàng)建自定義類(lèi)型和構(gòu)造函數(shù)時(shí),是十分有用的。 原文鏈接:https://kongchenglc.coding.me... 1.原型鏈 ??js的繼承機(jī)制不同于傳統(tǒng)的面向?qū)ο笳Z(yǔ)言,采用原型鏈實(shí)現(xiàn)繼承,基本思想是利用原型讓一個(gè)引用類(lèi)型繼承另一個(gè)引用類(lèi)型的屬性和方法。理解原型鏈必須先理...
摘要:可以通過(guò)構(gòu)造函數(shù)和原型的方式模擬實(shí)現(xiàn)類(lèi)的功能。原型式繼承與類(lèi)式繼承類(lèi)式繼承是在子類(lèi)型構(gòu)造函數(shù)的內(nèi)部調(diào)用超類(lèi)型的構(gòu)造函數(shù)。寄生式繼承這種繼承方式是把原型式工廠模式結(jié)合起來(lái),目的是為了封裝創(chuàng)建的過(guò)程。 js繼承的概念 js里常用的如下兩種繼承方式: 原型鏈繼承(對(duì)象間的繼承) 類(lèi)式繼承(構(gòu)造函數(shù)間的繼承) 由于js不像java那樣是真正面向?qū)ο蟮恼Z(yǔ)言,js是基于對(duì)象的,它沒(méi)有類(lèi)的概念。...
摘要:想要解決這樣的問(wèn)題的話,可以借助構(gòu)造函數(shù)也可以叫做偽造對(duì)象或經(jīng)典繼承。這種方式實(shí)現(xiàn)非常簡(jiǎn)單,就是在子對(duì)象的構(gòu)造函數(shù)中調(diào)用父對(duì)象的構(gòu)造函數(shù)。 原型式繼承 原型式繼承,就是一定一個(gè)函數(shù),該函數(shù)中創(chuàng)建一個(gè)臨時(shí)性的構(gòu)造函數(shù),將作為參數(shù),傳入的對(duì)象作為這個(gè)構(gòu)造函數(shù)的原型,最后返回這個(gè)構(gòu)造函數(shù)的實(shí)例對(duì)象 /*定義函數(shù):用于實(shí)現(xiàn)對(duì)象之間的繼承 參數(shù): obj:表示繼承關(guān)系中的父級(jí)對(duì)象...
摘要:綜上所述有原型鏈繼承,構(gòu)造函數(shù)繼承經(jīng)典繼承,組合繼承,寄生繼承,寄生組合繼承五種方法,寄生組合式繼承,集寄生式繼承和組合繼承的優(yōu)點(diǎn)于一身是實(shí)現(xiàn)基于類(lèi)型繼承的最有效方法。 一、前言 繼承是面向?qū)ο螅∣OP)語(yǔ)言中的一個(gè)最為人津津樂(lè)道的概念。許多面對(duì)對(duì)象(OOP)語(yǔ)言都支持兩種繼承方式::接口繼承 和 實(shí)現(xiàn)繼承 。 接口繼承只繼承方法簽名,而實(shí)現(xiàn)繼承則繼承實(shí)際的方法。由于js中方法沒(méi)有簽名...
摘要:創(chuàng)建子類(lèi)實(shí)例,可以向父類(lèi)構(gòu)造函數(shù)傳參數(shù)。修復(fù)如下其實(shí)方式組合繼承優(yōu)化核心通過(guò)這種方式,砍掉父類(lèi)的實(shí)例屬性,這樣在調(diào)用父類(lèi)的構(gòu)造函數(shù)的時(shí)候,就不會(huì)初始化兩次實(shí)例,避免組合繼承的缺點(diǎn)。優(yōu)點(diǎn)只調(diào)用一次父類(lèi)構(gòu)造函數(shù)。 2018.06.03 第一部分:導(dǎo)入 1、構(gòu)造函數(shù)的屬性 funcion A(name) { this.name = name; // 實(shí)例基本屬性 (該屬性,強(qiáng)調(diào)私有,...
閱讀 964·2023-04-25 23:54
閱讀 3047·2021-11-08 13:21
閱讀 3775·2021-09-27 13:35
閱讀 3392·2021-07-26 23:41
閱讀 1056·2019-08-30 15:52
閱讀 3439·2019-08-30 11:27
閱讀 2097·2019-08-29 18:37
閱讀 537·2019-08-29 17:24