首頁 web前端 js教程 詳解JavaScript基於物件導向之建立物件(1)_javascript技巧

詳解JavaScript基於物件導向之建立物件(1)_javascript技巧

May 16, 2016 pm 03:26 PM

這次我們深入的學習一下JavaScript物件導向技術,在學習之前,必要的說明一下一些物件導向的一些術語。這也是所有面對對象語言所擁有的共同點。有這樣幾個物件導向術語:
一、對象
       ECMA-262把物件(object)定義為「屬性的無序集合,每個屬性存放一個原始值、物件或函數」。嚴格來說,這意味著物件是無特定順序的值的陣列。儘管ECMAScript如此定義對象,但它更通用的定義是基於代碼的名詞(人、地點或事物)的表示。
二、類
       每個物件都由類別定義,可將類別視為物件的配方。類別不僅要定義物件的介面(interface)(開發者存取的屬性和方法),還要定義物件的內部工作(使屬性和方法發揮作用的程式碼)。編譯器和解釋程式都根據類別的說明建構物件。
三、實例
       程式使用類別建立物件時,產生的物件叫作類別的實例(instance)。對類別產生的物件的數量的唯一限制來自於運行程式碼的機器的物理記憶體。每個實例的行為相同,但實例處理一組獨立的資料。由類別建立物件實例的過程叫做實例化(instantiation)。
       在前面的章節我們提到過,ECMAScript並沒有正式的類別。相反,ECMA-262把物件定義描述為物件的配方。這是 ECMAScript邏輯上的一種折衷方案,因為物件定義實際上是物件本身。即使類別並不真正存在,我們也把物件定義叫做類,因為大多數開發者對此術語更熟悉,而且從功能上說,兩者是等價的。
       使用預設物件只是物件導向語言的能力的一部分,它真正強大之處在於能夠創造自己專用的物件。 ECMAScript 擁有許多建立物件的方法。
1、原始方式
       因為物件的屬性可以在物件建立後動態定義,所有許多開發者都在JavaScript 最初引入時編寫類似下面的程式碼:

var Car = new Object(); 
Car.color = "blue"; 
Car.doors = 4; 
Car.mpg = 25; 
Car.showColor = function() { 
  return this.color; 
}; 
document.write(Car.showColor());//输出:blue 
登入後複製

       在上方的程式碼中,建立物件Car。然後給它設置幾個屬性:它的顏色是藍色,有四個門,每加侖油可以跑 25 英里。最後一個屬性其實是指向函數的指針,這意味著該屬性是個方法。執行這段程式碼後,就可以使用物件Car。不過這裡有一個問題,就是可能需要創建多個Car的實例,這樣就造成了我們會重複許多類似的程式碼,這樣會很麻煩。
2、工廠方式
       要解決上述的多個類似物件聲明的問題,開發者創造了能創造並返回特定類型的物件的工廠方式。這種方式就是為了解決實例化物件產生大量重複的問題。
(1)無參數的工廠方式
       例如,函數createCar()可用來封裝前面所列的建立Car物件的操作:

function createCar() { 
var TempCar = new Object(); 
TempCar.color = "blue"; 
TempCar.doors = 4; 
TempCar.mpg = 25; 
TempCar.showColor = function() { 
    return this.color; 
 }; 
 return TempCar; 
}; 
var Car1 = createCar(); 
var Car2 = createCar(); 
document.write(Car1.showColor()+"<br/>");//输出:blue 
document.write(Car2.showColor());//输出:blue 
登入後複製

       在這裡,第一個範例中的所有程式碼都包含在createCar()函數中。此外,還有一行額外的程式碼,傳回TempCar 物件作為函數值。呼叫此函數,將建立新對象,並賦予它所有必要的屬性,複製出一個我們在前面說明過的Car對象。因此,透過這種方法,我們可以輕鬆地建立Car物件的兩個版本(Car1和 Car2),它們的屬性完全一樣。
(2)有參數的工廠方式
       我們也可以修改createCar()函數,給它傳遞各個屬性的預設值,而不是單純地賦予屬性預設值:

function createCar(Color,Doors,Mpg) { 
 var TempCar = new Object(); 
 TempCar.color = Color; 
 TempCar.doors = Doors; 
 TempCar.mpg = Mpg; 
 TempCar.showColor = function() { 
    return this.color; 
 }; 
 return TempCar; 
}; 
var Car1 = createCar("red",4,23); 
var Car2 = createCar("blue",3,25); 
document.write(Car1.showColor()+"<br/>");//输出:red 
document.write(Car2.showColor());//输出:blue 
登入後複製

       將createCar()函數加上參數,即可為要建立的Car物件的color、doors 和mpg屬性賦值。這使得兩個物件具有相同的屬性,卻有不同的屬性值。
工廠方式解決了重複實例化的問題,但是還是有一個問題,那就是前面的例子中,每次呼叫函數createCar(),都要建立新函數showColor(),這意味著每個物件都有自己的showColor () 版本。而事實上,每個物件都共享同一個函數。有些開發者在工廠函數外定義物件的方法,然後透過屬性指向該方法,從而避免這個問題:

function showColor() { 
   return this.color; 
}; 
function createCar(Color,Doors,Mpg) { 
 var TempCar = new Object(); 
 TempCar.color = Color; 
 TempCar.doors = Doors; 
 TempCar.mpg = Mpg; 
 TempCar.showColor = showColor; 
 return TempCar; 
}; 
var Car1 = createCar("red",4,23); 
var Car2 = createCar("blue",3,25); 
document.write(Car1.showColor()+"<br/>");//输出:red 
document.write(Car2.showColor());//输出:blue 
登入後複製

在上面这段重写的代码中,在函数 createCar()之前定义了函数 showColor()。在createCar()内部,赋予对象一个指向已经存在的 showColor() 函数的指针。从功能上讲,这样解决了重复创建函数对象的问题;但是从语义上讲,该函数不太像是对象的方法。所有这些问题都引发了开发者定义的构造函数的出现。
3、构造函数方式
创建构造函数就像创建工厂方式的函数一样容易。第一步选择构造函数的名字。根据惯例,这个名字的首字母大写,以使它与首字母通常是小写的变量名分开。除了这点不同,构造函数看起来很像工厂方式的函数。请看下面的例子:

function Car(Color,Doors,Mpg) { 
 this.color = Color; 
 this.doors = Doors; 
 this.mpg = Mpg; 
 this.showColor = function() { 
    return this.color; 
 }; 
}; 
var Car1 = new Car("red",4,23); 
var Car2 = new Car("blue",3,25); 
document.write(Car1.showColor()+"<br/>");//输出:red 
document.write(Car2.showColor());//输出:blue 
登入後複製

       下面为您解释上面的代码与工厂方式的差别。首先在构造函数内没有创建对象,而是使用this关键字。使用new运算符构造函数时,在执行第一行代码前先创建一个对象,只有用this才能访问该对象。然后可以直接赋予this属性,默认情况下是构造函数的返回值(不必明确使用 return 运算符)。现在,用new运算符和对象名Car创建对象,就更像 ECMAScript 中一般对象的创建方式了。
      就像工厂方式的函数,构造函数会重复生成函数,为每个对象都创建独立的函数版本。不过,与工厂方式的函数相似,也可以用外部函数重写构造函数,同样地,这么做语义上无任何意义。这正是下面要讲的原型方式的优势所在。在下篇文章中会详细的分析面向对象的原型方式以及其他综合的方式。

以上就是本文的全部内容,希望对大家的学习javascript程序设计有所帮助。

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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何創建和發布自己的JavaScript庫? 如何創建和發布自己的JavaScript庫? Mar 18, 2025 pm 03:12 PM

文章討論了創建,發布和維護JavaScript庫,專注於計劃,開發,測試,文檔和促銷策略。

如何在瀏覽器中優化JavaScript代碼以進行性能? 如何在瀏覽器中優化JavaScript代碼以進行性能? Mar 18, 2025 pm 03:14 PM

本文討論了在瀏覽器中優化JavaScript性能的策略,重點是減少執行時間並最大程度地減少對頁面負載速度的影響。

前端熱敏紙小票打印遇到亂碼問題怎麼辦? 前端熱敏紙小票打印遇到亂碼問題怎麼辦? Apr 04, 2025 pm 02:42 PM

前端熱敏紙小票打印的常見問題與解決方案在前端開發中,小票打印是一個常見的需求。然而,很多開發者在實...

誰得到更多的Python或JavaScript? 誰得到更多的Python或JavaScript? Apr 04, 2025 am 12:09 AM

Python和JavaScript開發者的薪資沒有絕對的高低,具體取決於技能和行業需求。 1.Python在數據科學和機器學習領域可能薪資更高。 2.JavaScript在前端和全棧開發中需求大,薪資也可觀。 3.影響因素包括經驗、地理位置、公司規模和特定技能。

如何使用瀏覽器開發人員工具有效調試JavaScript代碼? 如何使用瀏覽器開發人員工具有效調試JavaScript代碼? Mar 18, 2025 pm 03:16 PM

本文討論了使用瀏覽器開發人員工具的有效JavaScript調試,專注於設置斷點,使用控制台和分析性能。

如何使用JavaScript將具有相同ID的數組元素合併到一個對像中? 如何使用JavaScript將具有相同ID的數組元素合併到一個對像中? Apr 04, 2025 pm 05:09 PM

如何在JavaScript中將具有相同ID的數組元素合併到一個對像中?在處理數據時,我們常常會遇到需要將具有相同ID�...

如何使用源地圖調試縮小JavaScript代碼? 如何使用源地圖調試縮小JavaScript代碼? Mar 18, 2025 pm 03:17 PM

本文說明瞭如何使用源地圖通過將其映射回原始代碼來調試JAVASCRIPT。它討論了啟用源地圖,設置斷點以及使用Chrome DevTools和WebPack之類的工具。

神秘的JavaScript:它的作用以及為什麼重要 神秘的JavaScript:它的作用以及為什麼重要 Apr 09, 2025 am 12:07 AM

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

See all articles