欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

老生常談JavaScript面向對象基礎與this指向問題

 更新時間:2017年10月16日 08:36:13   作者:榆木疙瘩ii  
下面小編就為大家?guī)硪黄仙U凧avaScript面向對象基礎與this指向問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

前 言

我們的程序語言經(jīng)歷了從“面向機器”、到“面向過程”、再到“面向對象”的一個過程。而JavaScript是一門基于對象的一門語言,它介于面向過程與面向對象之間。在學習JavaScript的過程中,OOP是非常重要的一環(huán),下面我們來一起探討一下JS中的面向對象吧!??!

1 、OOP的基礎問題

1.1什么是面向過程和面向對象?

面向過程:專注于如何去解決一個問題的過程步驟。編程特點是由一個個的函數(shù)去實現(xiàn)每一步的過程步驟,沒有類和對象的概念。

面向對象:專注于由哪一個對象來解決這個問題。編程特點是出現(xiàn)了一個個的類,從類中拿到這個對象,由這個對象去解決具體的問題。

對于調(diào)用者來說,面向過程需要調(diào)用者自己去實現(xiàn)各種函數(shù)。而面向對象,只需要告訴調(diào)用者對象中具體方法的功能,而不需要調(diào)用者了解方法中的實現(xiàn)細節(jié)。

1.2面向對象的三大特征

繼承、封裝、多態(tài)

1.3類和對象的關系

① 類:一類具有相同特征(屬性)和行為(方法)的集合。

比如:人類-->屬性:身高、體重、性別 方法:吃飯、說話、走路

② 對象:從類中,拿出具有確定屬性值和方法的個體。

比如:張三-->屬性:身高180、體重180 方法:說話-->我叫張三,身高180

③ 類和對象的關系

類是抽象的,對象是具體的(類是對象的抽象化,對象是類的具體化)

解釋一下:

類是一個抽象的概念,只能說類有屬性和方法,但是不能給屬性賦具體的值。比如說人類有姓名,但是不能說人類的姓名叫啥。。。

對象是一個具體的個例,是將類中的屬性進行具體賦值而來的個體。比如說張三是人類的一個個體,可以說張三的姓名叫張三。也就是張三對人類的每一個屬性進行了具體的賦值,那么張三就是由人類產(chǎn)生的一個對象。

2、 JavaScript中的面向對象

2.1創(chuàng)建類和對象的步驟

①創(chuàng)建一個類(構造函數(shù)):類名必須使用大駝峰法則,即每個單詞的首字母必須大寫。

function 類名(屬性1){
  this.屬性1 = 屬性1;
  this.方法 = function(){
   //方法中要調(diào)用自身屬性,必須要使用this.屬性
  }
}

②通過類,實例化(new)出一個對象。

var obj = new 類名(屬性1的具體值);

obj.屬性; 調(diào)用屬性

obj.方法(); 調(diào)用方法

③注意事項

>>>通過類名,new出一個對象的過程,叫做“類的實例化”

>>>類中的this,會在實例化的時候,指向新new出的對象。所以,this.屬性 this.方法,實際上是將屬性和方法綁定在即將new出的對象上面。

>>>在類中,要調(diào)用自身屬性,必須使用this.屬性名、如果直接使用變量名,則無法訪問對應的屬性。

>>>類名必須使用大駝峰法則,注意與普通函數(shù)的區(qū)別。

2.2兩個重要屬性constructor和instanceof

①constructor:返回當前對象的構造函數(shù)

>>>zhangsan.constructor = Person; √

②instanceof:檢測一個對象,是不是一個類的實例;

>>>lisi instanceof Person √ lisi是通過Person類new出的

>>>lisi instanceof Object √ 所有對象都是Object的實例

>>>Person instanceof Object √ 函數(shù)本身也是對象

3、 JavaScript中的this指向問題

在上一部分中,我們創(chuàng)建了一個類,并通過這個類new出了一個對象。 但是,這里面出現(xiàn)了大量的this。 很多同學就要懵逼了,this不是“這個”的意思嗎?為什么我在函數(shù)里面寫的this定義的屬性,最后到了函數(shù)new出的對象呢??

3.1誰最終調(diào)用函數(shù),this就指向誰!

① this指向誰,不應該考慮函數(shù)在哪聲明,而應該考慮函數(shù)在哪調(diào)用??!

② this指向的,永遠只可能是對象,不可能是函數(shù)!!

③ this指向的對象,叫做函數(shù)的上下文context,也叫函數(shù)的調(diào)用者。

3.2this指向的規(guī)律(與函數(shù)的調(diào)用方式息息相關!)

① 通過函數(shù)名()調(diào)用的,this永遠指向window

func(); // this--->window
//【解釋】 我們直接用一個函數(shù)名()調(diào)用,函數(shù)里面的this,永遠指向window。

② 通過對象.方法調(diào)用的,this指向這個對象

// 狹義對象
 var obj = {
  name:"obj",
  func1 :func
 };
 obj.func1(); // this--->obj
//【解釋】我們將func函數(shù)名,當做了obj這個對象的一個方法,然后使用對象名.方法名, 這時候函數(shù)里面的this指向這個obj對象。

 // 廣義對象
 document.getElementById("div").onclick = function(){
  this.style.backgroundColor = "red";
}; // this--->div
//【解釋】對象打點調(diào)用還有一個情況,我們使用getElementById取到一個div控件,也是一種廣義的對象,用它打點調(diào)用函數(shù),則函數(shù)中的this指向這個div對象。

③ 函數(shù)作為數(shù)組的一個元素,用數(shù)組下標調(diào)用,this指向這個數(shù)組

var arr = [func,1,2,3];
arr[0](); // this--->arr
//【解釋】這個,我們把函數(shù)名,當做數(shù)組中的一個元素。使用數(shù)組下標調(diào)用,則函數(shù)中的this將指向這個數(shù)組arr。

④ 函數(shù)作為window內(nèi)置函數(shù)的回調(diào)函數(shù)使用,this指向window。比如setTimeout、setInterval等

setTimeout(func,1000);// this--->window
//setInterval(func,1000);
//【解釋】使用setTimeout、setInterval等window內(nèi)置函數(shù)調(diào)用函數(shù),則函數(shù)中的this指向window。

⑤ 函數(shù)作為構造函數(shù),使用new關鍵字調(diào)用,this指向新new出的對象

var obj = new func(); //this--->new出的新obj
//【解釋】這個就是第二部分我們使用構造函數(shù)new對象的語句,將函數(shù)用new關鍵字調(diào)用,則函數(shù)中的this指向新new出的對象。

3.3關于this問題的面試題

var fullname = 'John Doe';
var obj = {
  fullname: 'Colin Ihrig',
  prop: {
    fullname: 'Aurelio De Rosa',
    getFullname: function() {
      return this.fullname;
    }
  }
};
console.log(obj.prop.getFullname()); 
// 函數(shù)的最終調(diào)用者 obj.prop 
   
var test = obj.prop.getFullname;
console.log(test()); 
// 函數(shù)的最終調(diào)用者 test() this-> window
   
obj.func = obj.prop.getFullname;
console.log(obj.func()); 
// 函數(shù)最終調(diào)用者是obj
   
var arr = [obj.prop.getFullname,1,2];
arr.fullname = "JiangHao";
console.log(arr[0]());
// 函數(shù)最終調(diào)用者數(shù)組

好了,這篇博客,我們了解了什么是面向對象、類和對象的關系、JS中聲明類與對象的步驟,以及重點講解的this指向問題! 希望能夠幫助大家真正的理解了this的認知,下面我會繼續(xù)給大家分享關于面向對象方面的問題。多謝大家的支持!!!

以上這篇老生常談JavaScript面向對象基礎與this指向問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • layer.open關閉父窗口 以及調(diào)用父頁面的方法

    layer.open關閉父窗口 以及調(diào)用父頁面的方法

    今天小編就為大家分享一篇layer.open關閉父窗口 以及調(diào)用父頁面的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • Bootstrap編寫一個同時適用于PC、平板、手機的登陸頁面

    Bootstrap編寫一個同時適用于PC、平板、手機的登陸頁面

    這篇文章主要為大家詳細介紹了Bootstrap編寫一個同時適用于PC、平板、手機的登陸頁面,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-06-06
  • 一文帶你深入理解JavaScript中的時間處理

    一文帶你深入理解JavaScript中的時間處理

    在JavaScript中,處理時間和日期是常見任務之一,涉及到從用戶界面的日期選擇器到服務器上的時間戳,再到時間間隔的計算,本文將深入探討JavaScript中的時間處理,需要的朋友可以參考下
    2023-09-09
  • javascript 彈出層組件(升級版)

    javascript 彈出層組件(升級版)

    前面文章里寫過一個彈出層對話框,但ie6下有bug,根本沒有實現(xiàn)position:fixed的效果,當時沒有真實ie6環(huán)境,測試疏忽,匆匆放到博客上,還讓一些讀者看到甚至使用,在這里表示萬分抱歉啊
    2011-05-05
  • 微信小程序實現(xiàn)音頻文件播放進度的實例代碼

    微信小程序實現(xiàn)音頻文件播放進度的實例代碼

    這篇文章主要介紹了微信小程序實現(xiàn)音頻文件播放進度的實例代碼,代碼包括對進度條的實現(xiàn)及進度條的滑動,對大家的工作或學習具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • 監(jiān)控微信小程序中的慢HTTP請求過程詳解

    監(jiān)控微信小程序中的慢HTTP請求過程詳解

    這篇文章主要介紹了監(jiān)控微信小程序中的慢HTTP請求過程詳解,F(xiàn)undebug 的微信小程序監(jiān)控插件在 0.5.0 版本已經(jīng)支持監(jiān)控 HTTP 請求錯誤,在小程序中通過wx.request發(fā)起 HTTP 請求,如果請求失敗,會被捕獲并上報,需要的朋友可以參考下
    2019-07-07
  • 簡單實現(xiàn)Bootstrap標簽頁

    簡單實現(xiàn)Bootstrap標簽頁

    這篇文章主要教大家簡單實現(xiàn)Bootstrap標簽頁,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • 借助script進行Http跨域請求:JSONP實現(xiàn)原理及代碼

    借助script進行Http跨域請求:JSONP實現(xiàn)原理及代碼

    script元素的src屬性能設置URL并發(fā)起HTTP GET請求實現(xiàn)腳本操作HTTP可以跨域通信而不受限與同源策略,接下來為大家詳細介紹下Http跨域請求實現(xiàn),感興趣的你可以參考下哈
    2013-03-03
  • 利用transition實現(xiàn)文字上下抖動的效果

    利用transition實現(xiàn)文字上下抖動的效果

    這篇文章主要給大家介紹了利用transition屬性如何實現(xiàn)文字上下抖動的效果,文中給出了詳細的介紹和完整的實例代碼,相信對大家的學習具有一定的參考借鑒價值,有需要的朋友們下面來一起看看吧。
    2017-01-01
  • 在瀏覽器中獲取當前執(zhí)行的腳本文件名的代碼

    在瀏覽器中獲取當前執(zhí)行的腳本文件名的代碼

    同事提了一個問題,如何在瀏覽器中動態(tài)插入的 JavaScript 文件中,獲取當前文件名?
    2011-07-07

最新評論