首頁 >web前端 >js教程 >JavaScript物件導向與this指向(附程式碼)

JavaScript物件導向與this指向(附程式碼)

php中世界最好的语言
php中世界最好的语言原創
2018-04-17 14:27:411597瀏覽

這次帶給大家JavaScript物件導向與this指向(附程式碼),使用JavaScript物件導向與this指向的注意事項有哪些,以下是實戰案例,一起來看一下。

我們的程式語言經歷了從「機器導向」、到「過程導向」、再到「物件導向」的一個過程。而JavaScript則是一門基於物件的語言,它介於過程與物件導向之間。在學習JavaScript的過程中,OOP是非常重要的一環,以下我們來一起探討JS中的物件導向吧! ! !

1 、OOP的基礎問題

1.1什麼是面向過程和物件導向?

面向過程:專注於如何解決一個問題的流程步驟。程式設計特點是由一個個的函數去實現每一步的過程步驟,沒有類別和物件的概念。

物件導向:專注於由哪一個物件來解決這個問題。程式設計特點是出現了一個個的類,從類別中拿到這個對象,由這個對象去解決具體的問題。

對於呼叫者來說,面向過程需要呼叫者自己去實作各種函數。而面向對象,只需要告訴呼叫者物件中具體方法的功能,而不需要呼叫者了解方法中的實作細節。

1.2物件導向的三大特徵

繼承、封裝、多態

1.3類別與物件的關係

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

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

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

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

# ③ 類別和物件的關係

類別是抽象的,物件是具體的(類別是物件的抽象化,物件是類別的具體化)

# 解釋一下:

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

物件是一個具體的個例,是將類別中的屬性進行具體賦值而來的個體。比如說張三是人類的一個個體,可以說張三的姓名叫張三。也就是張三對人類的每一個屬性進行了具體的賦值,那麼張三就是由人類產生的一個物件。

2、 JavaScript中的物件導向

# 2.1建立類別和物件的步驟

①建立一個類別(建構子):類別名稱必須使用大駝峰法則,即每個單字的首字母必須大寫。

function 类名(属性1){
  this.属性1 = 属性1;
  this.方法 = function(){
   //方法中要调用自身属性,必须要使用this.属性
  }
}

②透過類,實例化(new)出一個物件。

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

# obj.屬性; 呼叫屬性

# obj.方法(); 呼叫方法

③注意事項

>>>透過類別名,new出一個物件的過程,叫做「類別的實例化」

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

>>>在類別中,要呼叫自身屬性,必須使用this.屬性名、如果直接使用變數名,則無法存取對應的屬性。

>>>類別名稱必須使用大駝峰法則,注意與一般函數的差異。

2.2兩個重要屬性constructor和instanceof

①constructor:返回当前对象的构造函数

>>>zhangsan.constructor = Person; √

②instanceof:检测一个对象,是不是一个类的实例;

>>>lisi instanceof Person √ lisi是通过Person类new出的

>>>lisi instanceof Object √ 所有对象都是Object的实例

>>>Person instanceof Object √ 函数本身也是对象

3、 JavaScript中的this指向问题

在上一部分中,我们创建了一个类,并通过这个类new出了一个对象。 但是,这里面出现了大量的this。 很多同学就要懵逼了,this不是“这个”的意思吗?为什么我在函数里面写的this定义的属性,最后到了函数new出的对象呢??

3.1谁最终调用函数,this就指向谁!

① this指向谁,不应该考虑函数在哪声明,而应该考虑函数在哪调用!!

② this指向的,永远只可能是对象,不可能是函数!!

③ this指向的对象,叫做函数的上下文context,也叫函数的调用者。

3.2this指向的规律(与函数的调用方式息息相关!)

① 通过函数名()调用的,this永远指向window

func(); // this--->window
//【解释】 我们直接用一个函数名()调用,函数里面的this,永远指向window。

② 通过对象.方法调用的,this指向这个对象

// 狭义对象
 var obj = {
  name:"obj",
  func1 :func
 };
 obj.func1(); // this--->obj
//【解释】我们将func函数名,当做了obj这个对象的一个方法,然后使用对象名.方法名, 这时候函数里面的this指向这个obj对象。
 // 广义对象
 document.getElementById("p").onclick = function(){
  this.style.backgroundColor = "red";
}; // this--->p
//【解释】对象打点调用还有一个情况,我们使用getElementById取到一个p控件,也是一种广义的对象,用它打点调用函数,则函数中的this指向这个p对象。

③ 函数作为数组的一个元素,用数组下标调用,this指向这个数组

var arr = [func,1,2,3];
arr[0](); // this--->arr
//【解释】这个,我们把函数名,当做数组中的一个元素。使用数组下标调用,则函数中的this将指向这个数组arr。

④ 函数作为window内置函数的回调函数使用,this指向window。比如setTimeout、setInterval等

setTimeout(func,1000);// this--->window
//setInterval(func,1000);
//【解释】使用setTimeout、setInterval等window内置函数调用函数,则函数中的this指向window。

⑤ 函数作为构造函数,使用new关键字调用,this指向新new出的对象

var obj = new func(); //this--->new出的新obj
//【解释】这个就是第二部分我们使用构造函数new对象的语句,将函数用new关键字调用,则函数中的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()); 
// 函数的最终调用者 obj.prop 
   
var test = obj.prop.getFullname;
console.log(test()); 
// 函数的最终调用者 test() this-> window
   
obj.func = obj.prop.getFullname;
console.log(obj.func()); 
// 函数最终调用者是obj
   
var arr = [obj.prop.getFullname,1,2];
arr.fullname = "JiangHao";
console.log(arr[0]());
// 函数最终调用者数组

好了,这篇博客,我们了解了什么是面向对象、类和对象的关系、JS中声明类与对象的步骤,以及重点讲解的this指向问题! 希望能够帮助大家真正的理解了this的认知,下面我会继续给大家分享关于面向对象方面的问题。多谢大家的支持!!!

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

Vue中computed属性的使用方法

ajax与跨域jsonp


以上是JavaScript物件導向與this指向(附程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn