面向?qū)ο?/h2>

問題1: OOP 指什么?有哪些特性

OOP是指面向?qū)ο缶幊蹋鼘⒄鎸?shí)世界各種復(fù)雜的關(guān)系,抽象為一個(gè)個(gè)對象,然后由對象之間的分工與合作,完成對真實(shí)世界的模擬。
那么,“對象”(object)到底是什么?
我們從兩個(gè)層次來理解。
(1)對象是單個(gè)實(shí)物的抽象。
一本書、一輛汽車、一個(gè)人都可以是對象,一個(gè)數(shù)據(jù)庫、一張網(wǎng)頁、一個(gè)與遠(yuǎn)程服務(wù)器的連接也可以是對象。當(dāng)實(shí)物被抽象成對象,實(shí)物之間的關(guān)系就變成了對象之間的關(guān)系,從而就可以模擬現(xiàn)實(shí)情況,針對對象進(jìn)行編程。
(2)對象是一個(gè)容器,封裝了屬性(property)和方法(method)。
屬性是對象的狀態(tài),方法是對象的行為(完成某種任務(wù))。比如,我們可以把動(dòng)物抽象為animal對象,使用“屬性”記錄具體是那一種動(dòng)物,使用“方法”表示動(dòng)物的某種行為(奔跑、捕獵、休息等等)。

有封裝、多態(tài)和繼承特性

  • 封裝,也就是把客觀事物封裝成抽象的類,并且類可以把自己的數(shù)據(jù)和方法只讓可信的類或者對象操作,對不可信的進(jìn)行信息隱藏。封裝是面向?qū)ο蟮奶卣髦唬菍ο蠛皖惛拍畹闹饕匦浴?簡單的說,一個(gè)類就是一個(gè)封裝了數(shù)據(jù)以及操作這些數(shù)據(jù)的代碼的邏輯實(shí)體。在一個(gè)對象內(nèi)部,某些代碼或某些數(shù)據(jù)可以是私有的,不能被外界訪問。通過這種方式,對象對內(nèi)部數(shù)據(jù)提供了不同級別的保護(hù),以防止程序中無關(guān)的部分意外的改變或錯(cuò)誤的使用了對象的私有部分。
  • 繼承是指可以讓某個(gè)類型的對象獲得另一個(gè)類型的對象的屬性的方法。它支持按級分類的概念。繼承是指這樣一種能力:它可以使用現(xiàn)有類的所有功能,并在無需重新編寫原來的類的情況下對這些功能進(jìn)行擴(kuò)展。 通過繼承創(chuàng)建的新類稱為“子類”或“派生類”,被繼承的類稱為“基類”、“父類”或“超類”。繼承的過程,就是從一般到特殊的過程。要實(shí)現(xiàn)繼承,可以通過“繼承”(Inheritance)和“組合”(Composition)來實(shí)現(xiàn)。繼承概念的實(shí)現(xiàn)方式有二類:實(shí)現(xiàn)繼承與接口繼承。實(shí)現(xiàn)繼承是指直接使用基類的屬性和方法而無需額外編碼的能力;接口繼承是指僅使用屬性和方法的名稱、但是子類必須提供實(shí)現(xiàn)的能力;
  • 多態(tài)就是指一個(gè)類實(shí)例的相同方法在不同情形有不同表現(xiàn)形式。多態(tài)機(jī)制使具有不同內(nèi)部結(jié)構(gòu)的對象可以共享相同的外部接口。這意味著,雖然針對不同對象的具體操作不同,但通過一個(gè)公共的類,它們(那些操作)可以通過相同的方式予以調(diào)用。

問題2: 如何通過構(gòu)造函數(shù)的方式創(chuàng)建一個(gè)擁有屬性和方法的對象?

function People(name, age) {
  this.name = name
  this.age = age
}
People.prototype.sayName = function () {
  console.log('my name is ' + this.name)
}

var p1 = new People(" 饑人谷 ");

p1.sayName()  //  my name is 饑人谷

問題3: prototype 是什么?有什么特性

prototype是指原型對象,JavaScript 的每個(gè)對象都繼承另一個(gè)對象,后者稱為“原型”(prototype)對象。只有null除外,它沒有自己的原型對象。
通過構(gòu)造函數(shù)生成實(shí)例對象時(shí),會自動(dòng)為實(shí)例對象分配原型對象。每一個(gè)構(gòu)造函數(shù)都有一個(gè)prototype屬性,這個(gè)屬性就是實(shí)例對象的原型對象。
繼承:原型對象上的所有屬性和方法,都能被派生對象共享。這就是 JavaScript 繼承機(jī)制的基本設(shè)計(jì)。

問題4:畫出如下代碼的原型圖

function People (name){
  this.name = name;
  this.sayName = function(){
    console.log('my name is:' + this.name);
  }
}

People.prototype.walk = function(){
  console.log(this.name + ' is walking');  
}

var p1 = new People('饑人谷');
var p2 = new People('前端');
1.PNG

問題5: 創(chuàng)建一個(gè) Car 對象,擁有屬性name、color、status;擁有方法run,stop,getStatus

function Car(name, color, status) {
  this.name = name
  this.color = color
  this.status = status
  this.run = function () {
     console.log('run')
  }
  this.stop = function () {
     console.log('run')
  }
  this.getState = function () {
     console.log(this.status)
  }
}
var car = new Car('F1', 'red', 'good')

問題6: 創(chuàng)建一個(gè) GoTop 對象,當(dāng) new 一個(gè) GotTop 對象則會在頁面上創(chuàng)建一個(gè)回到頂部的元素,點(diǎn)擊頁面滾動(dòng)到頂部。擁有以下屬性和方法

  1. ct屬性,GoTop 對應(yīng)的 DOM 元素的容器
  2. target屬性, GoTop 對應(yīng)的 DOM 元素
  3. bindEvent 方法, 用于綁定事件
  4. createNode 方法, 用于在容器內(nèi)創(chuàng)建節(jié)點(diǎn)
function GoTop(ct) {
    this.ct = ct || $('body')
    this.createNode = function () {
      var $button = $('<button>GoTop</button>')
      this.ct.append($button)
      return $button
    }
    this.target = this.createNode()
    this.bindEvent = function () {
      this.target.on('click',function () {
        $(window).scrollTop(0)
      })
    }

  }

  var b = new GoTop()
  b.bindEvent()

link

問題7: 使用木桶布局實(shí)現(xiàn)一個(gè)圖片墻

link

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容