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

資訊專欄INFORMATION COLUMN

js對(duì)象的封裝、繼承和多態(tài)

Stardustsky / 1853人閱讀

摘要:面向?qū)ο笕筇匦跃褪欠庋b繼承和多態(tài),簡(jiǎn)單理解,對(duì)于貓這種動(dòng)物,它本身就是一個(gè)封裝好的類,你只需要供它吃喝輸入,它就能表現(xiàn)貓的行為輸出,同時(shí)它繼承了動(dòng)物所具有的習(xí)性吃東西等,而不同的貓因?yàn)樗幁h(huán)境或者習(xí)性的不同,可能會(huì)有不同的表現(xiàn)和行為,這就

面向?qū)ο笕筇匦跃褪欠庋b繼承和多態(tài),簡(jiǎn)單理解,對(duì)于貓這種動(dòng)物,它本身就是一個(gè)封裝好的類,你只需要供它吃喝(輸入),它就能表現(xiàn)貓的行為(輸出),同時(shí)它繼承了動(dòng)物所具有的習(xí)性(吃東西等~),而不同的貓因?yàn)樗幁h(huán)境或者習(xí)性的不同,可能會(huì)有不同的表現(xiàn)和行為,這就是多態(tài)。

封裝
把客觀事物封裝成抽象的類,隱藏屬性和方法的實(shí)現(xiàn)細(xì)節(jié),僅對(duì)外公開接口。

① 在ES6之前,沒(méi)有class這個(gè)概念,借由原型對(duì)象和構(gòu)造函數(shù)來(lái)實(shí)現(xiàn)

function Cat(name, food) {
  this.name = name // 公有屬性
  this.food = food
}
Cat.prototype.say = function() { // 公有方法
  console.log(this.name + " likes eating " + this.food)
}
Cat.see = function() {
  console.log("這是靜態(tài)方法,無(wú)需實(shí)例化可調(diào)用")
}
var cat = new Cat("Lazier","mouse")
cat.say() // 實(shí)例共享原型屬性和方法

② ES6的class

class Cat{
  constructor(name, food){
    this.name = name
    this.food = food
  }
  static see() {
    console.log("這是靜態(tài)方法,無(wú)需實(shí)例化可調(diào)用")
  }
  say(){
    console.log(this.name+" likes eating " + this.food)
  }
}
var cat = new Cat("Lazier","mouse")
cat.say()

以上class的基本實(shí)現(xiàn)原理如下 ↓

var Cat = function(){
  function Cat(name, food){
    this.name = name
    this.food = food
  }
  // 執(zhí)行掛載函數(shù),創(chuàng)建類
  createClass(Cat,[{key:"say",value:function(){
    console.log(this.name+" likes eating " + this.food)
  }}],[{key:"see",value:function(){
    console.log("這是靜態(tài)方法,無(wú)需實(shí)例化可調(diào)用")}])
}

// 定義對(duì)象屬性
let defineProperties = function(target, props) {
  for (var i = 0; i < props.length; i++) {
    var descriptor = props[i]
    Object.defineProperty(target, descriptor.key, descriptor)
  }
}   
// 掛載函數(shù),將靜態(tài)或動(dòng)態(tài)方法分別掛載到Cat和Cat的prototype上
var createClass = function({
  return function(Constructor,protoProps,staticProps){
    if(protoProps){ // 原型方法
      defineProperties(Constructor.prototype,protoProps)
    }
    if(staticProps){ // 靜態(tài)方法
      defineProperties(Constructor,staticProps)
    }
  }
})

了解面向?qū)ο蟮墓小⑺接?、靜態(tài)屬性和方法可以看下面這篇文章的總結(jié)

js面向?qū)ο笾?、私有、靜態(tài)屬性和方法詳解

繼承
子類可以使用父類的所有功能,并且對(duì)這些功能進(jìn)行擴(kuò)展。繼承的過(guò)程,就是從一般到特殊的過(guò)程。

js實(shí)現(xiàn)繼承有多種方式

原型鏈繼承

// 將子類的prototype指向父類的實(shí)例
function Parent(){}
function Son(){}
Son.prototype = new Parent()
// * 把Son的原型對(duì)象的constructor指向Son,解決類型判斷問(wèn)題
Son.prototype.constructor = Son
借助構(gòu)造函數(shù)繼承(使用call和apply實(shí)現(xiàn)繼承)
function Parent(){}
function Son(){
    // 將父類函數(shù)中的this,強(qiáng)行綁定為子類的this
    // 可傳參
    Parent.call(this, arguments);
}
組合繼承
// 原型屬性方法由原型鏈實(shí)現(xiàn)繼承,實(shí)例屬性方法由借用構(gòu)造函數(shù)實(shí)現(xiàn)繼承
// 這樣,在原型上定義方法實(shí)現(xiàn)了函數(shù)復(fù)用,又保證每個(gè)實(shí)例都有它自己的屬性
function Parent(name){
    this.name = name
}
function Son(name, age){
    // 繼承父類的實(shí)例屬性方法,之后再添加自己的實(shí)例屬性方法
    Parent.call(this, name);
    this.age = age
}
Son.prototype = new Parent()
// 重寫Son的原型對(duì)象
Son.prototype.constructor = Son

var demo = new Son("jacksonzhou", 23)
寄生式組合繼承 – 現(xiàn)在最常用的繼承方法
// 獲得父類原型屬性方法的副本,解決組合繼承的屬性重復(fù)問(wèn)題
function inheritPrototype(son, parent) {
    var prototype = object(parent.prototype)
    prototype.constructor = son
    son.prototype = prototype
}

function Parent(name){
    this.name = name
}
function Son(name, age){
    Parent.call(this, name)
    this.age = age
}
Son.prototype = inheritPrototype(Son, Parent)

var demo = new Son("jacksonzhou", 23)

多態(tài)
同一操作用在不同對(duì)象上,可以產(chǎn)生不同的解釋和不同的執(zhí)行結(jié)果

var makeSound=function(animal){
  animal.sound()
}
// 聲明狗的構(gòu)造函數(shù)
var Dog=function(){}
Dog.prototype.sound=function(){
  console.log("汪汪汪")
}
// 聲明貓的構(gòu)造函數(shù)
var Cat=function(){}
Cat.prototype.sound=function(){
  console.log("喵喵喵")
}
// 分別調(diào)用他們的叫法
makeSound(new Dog())
makeSound(new Cat())
// 非多態(tài)寫法
var makeSound=function(animal){
  if(animal instanceof Dog){
    console.log("汪汪汪")
  }else if(animal instanceof Cat){
    console.log("喵喵喵")
  }
}
var Dog=function(){}
var Cat=function(){}
// 分別調(diào)用他們的叫法
makeSound(new Dog())
makeSound(new Cat())
// 很明顯,后續(xù)有其他動(dòng)物加入都要去修改makeSound函數(shù),很不優(yōu)雅!
這里要介紹下方法重載

方法重載是讓類以統(tǒng)一的方式處理不同類型數(shù)據(jù)的一種手段。表現(xiàn)為多個(gè)同名函數(shù)同時(shí)存在,但具有不同的參數(shù)個(gè)數(shù)或類型。調(diào)用方法時(shí)通過(guò)傳遞給它們的不同參數(shù)個(gè)數(shù)和參數(shù)類型來(lái)決定具體使用哪個(gè)方法, 這也是一種多態(tài)性。

其實(shí)js本身并沒(méi)有這個(gè)概念,但我們可以通過(guò)操作參數(shù)的類數(shù)組arguments,根據(jù)該類數(shù)組的長(zhǎng)度以及其元素的類型來(lái)選擇不同的實(shí)現(xiàn),來(lái)模擬實(shí)現(xiàn)函數(shù)重載效果

// js的函數(shù)參數(shù)相當(dāng)靈活~可理解成一個(gè)動(dòng)態(tài)的類數(shù)組
// 不加參數(shù),調(diào)用時(shí)有傳入?yún)?shù)也不會(huì)報(bào)錯(cuò)
function countCat(){ 
  if(arguments.length==1){ 
    console.log(`這是一只貓,${arguments[0]}`)
  } 
  else if(arguments.length==2){ 
    console.log(`這是兩只貓,${arguments[0]}和${arguments[1]}`)
  } 
  else{
    console.log("沒(méi)貓了~")
  } 
} 
countCat()
countCat("Tom")
countCat("Tom","Mary")

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/106883.html

相關(guān)文章

  • js面向對(duì)象特征

    摘要:我們都知道面向?qū)ο髶碛腥筇卣?,分別為封裝繼承多態(tài),其實(shí)在腳本語(yǔ)言中是不存在多態(tài)的,但是可以用的方式實(shí)現(xiàn)多態(tài)中的兩種效果重載重寫,那下面我們就來(lái)說(shuō)一下面向?qū)ο蟮奶卣鞣庋b把抽象出的屬性和對(duì)屬性的方法封裝在一起對(duì)外實(shí)現(xiàn)接口開放,說(shuō)白了就是封裝一 我們都知道js面向?qū)ο髶碛腥筇卣?,分別為封裝、繼承、多態(tài),其實(shí)在javaScript腳本語(yǔ)言中是不存在多態(tài)的,但是可以用js的方式實(shí)現(xiàn)多態(tài)中的兩...

    Jenny_Tong 評(píng)論0 收藏0
  • 淺談JavaScript面向對(duì)象封裝、繼承多態(tài)

    摘要:會(huì)造成內(nèi)存浪費(fèi)的問(wèn)題構(gòu)造函數(shù)繼承聲明父類聲明子類生成實(shí)例組合式繼承組合式繼承是汲取了兩者的優(yōu)點(diǎn),既避免了內(nèi)存浪費(fèi),又使得每個(gè)實(shí)例化的子類互不影響。 寫在前面 既然是淺談,就不會(huì)從原理上深度分析,只是幫助我們更好地理解... 面向?qū)ο笈c面向過(guò)程 面向?qū)ο蠛兔嫦蜻^(guò)程是兩種不同的編程思想,剛開始接觸編程的時(shí)候,我們大都是從面向過(guò)程起步的,畢竟像我一樣,大家接觸的第一門計(jì)算機(jī)語(yǔ)言大概率都是C語(yǔ)...

    MAX_zuo 評(píng)論0 收藏0
  • 學(xué)習(xí)設(shè)計(jì)模式前需要知道事情

    摘要:為什么要學(xué)習(xí)設(shè)計(jì)模式做事情之前問(wèn)個(gè)為什么總是好的。設(shè)計(jì)模式的使用方法關(guān)于使用方式,像我這種初學(xué)者最容易犯的錯(cuò)誤就是生搬硬套,但是模仿本來(lái)也是學(xué)習(xí)的一個(gè)過(guò)程,最重要的事情是在模仿中要學(xué)會(huì)思考。 為什么要學(xué)習(xí)設(shè)計(jì)模式? 做事情之前問(wèn)個(gè)為什么總是好的。關(guān)于設(shè)計(jì)模式的好壞,我在知乎上也看過(guò)一些討論,有知友對(duì)其提出過(guò)一些疑問(wèn),里面有一些關(guān)于設(shè)計(jì)模式的觀點(diǎn): 設(shè)計(jì)模式有何不妥,所謂的荼毒體現(xiàn)在哪...

    kviccn 評(píng)論0 收藏0
  • SegmentFault 技術(shù)周刊 Vol.32 - 七夕將至,你對(duì)象”還好嗎?

    摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類是相似對(duì)象的描述,稱為類的定義,是該類對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過(guò)對(duì)類的實(shí)體化形成的對(duì)象。一類的對(duì)象抽取出來(lái)。注意中,對(duì)象一定是通過(guò)類的實(shí)例化來(lái)的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...

    李昌杰 評(píng)論0 收藏0
  • SegmentFault 技術(shù)周刊 Vol.32 - 七夕將至,你對(duì)象”還好嗎?

    摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類是相似對(duì)象的描述,稱為類的定義,是該類對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過(guò)對(duì)類的實(shí)體化形成的對(duì)象。一類的對(duì)象抽取出來(lái)。注意中,對(duì)象一定是通過(guò)類的實(shí)例化來(lái)的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...

    Lyux 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<