首頁 web前端 js教程 Javascript繼承(上)-物件建構介紹_JavaScript

Javascript繼承(上)-物件建構介紹_JavaScript

May 16, 2016 pm 05:48 PM
創建 物件

Javascript中存在「類別」麼?

萬物皆物件
Javascript中除了基本資料(Undefined、Null、Boolean、Number、String),其他都是物件(Object)。
實際上,Javascript中的物件是資料與功能的集合。例如我們知道:

複製程式碼 程式碼如下:

var foo = new Function("alert ('hello world!')");
foo();

可見foo是個函數,也是一種物件。再比如說:
複製程式碼 程式碼如下:

{ //do something
}

foo.data = 123;
foo["data2"] = "hello";

alert(foo.data);
alert(foo.data2);

函數也可以像物件一樣加入屬性。

物件的建構 一般我們用建構子來建構對象,但如果沒有建構函數,我們也有辦法建構我們想要的物件:

複製程式碼 程式碼如下:
function creatPerson(__name, __sex, __age){
return {
freturn { sex: __sex,
age: __age,
get: function(__key){
alert(this[__key]);
}
};
}
}
}
}; >
var Bob = creatPerson("Bob", "male", 18);
Bob.get("name"); //Bob
Bob.get("sex"); //male
Bob.get("age"); //18


但這不夠,我希望方法是可以共享的。例如我再用該函數創建一個Tom對象,get函數就又被創建了一次,這明顯地浪費了我的記憶體。 導入共享資源

因為我們知道函數也是對象,所以我們可以把需要共享的方法或屬性放在他「身上」: 程式碼如下:


function creatPerson(__name, __sex, __age){
var commoncal = guments. ;
return {
//自身的屬性
name: __name,
sex: __sex,
age: __age,
//自身的方法
sayhi: function( ){alert("hi");},
//共享的方法
get: common.get,
getType: common.getType,
//共享的屬性
type: common.type
};
}
creatPerson.common = {
get:function(__key){
alert(this[__key]);
},
getType : function(){
alert(this.type);
},
type: "Person"
};

var Bob = creatPerson("Bob", "male ", 18);
Bob.get("name"); //Bob
Bob.get("sex"); //male
Bob.getType(); //Person


於是我們就用蹩腳的方法,成功的創建了一個擁有自有屬性方法和共享屬性方法的物件。但實際上,Javascript就是這麼蹩腳地創造物件的。
其實共享屬性沒有真正​​實現,因為這個共享屬性,依然只是副本。這並不是我們真正希望的共享屬性。
new關鍵字

和上面的「物件的建構」相同,new的目的是建立物件的自有屬性和方法。例如: 程式碼如下:


function Person(name, __sex,__name, __age)
this.name = __name;
this.sex = __sex;
this.age = __age;
this.get = function(__key){
alert(this[__key]);
};
}

var Bob = new Person("Bob", "male", 18);
Bob.get("name"); //Bob
Bob.get("sex"); //male
Bob.get("age"); //18

原型(Prototype)

Javascript的作者用了和上面「導入共享資源」的方法差不多。既然函數也是對象,那麼把需要分享的「東東」放在他「身上」吧: 程式碼如下:


function Person(__name, __sex, __age){
this.name = __name;
this.sex = __sex;
this.age = __age;
this.sayhi = function(__key){
alert("hi");
};
}
Person.prototype = {
constructor: Person,
get: function( __key){
alert(this[__key]);
}
};

var Bob = new Person("Bob", "male", 18);
Bob .get("name"); //Bob
Bob.get("sex"); //male
alert(Bob.constructor); //function Person


Javascript創建物件的模型是簡潔的,new來處理自身問題,prototype來處理共享問題。

如果說Java的物件(實例)產生方式是將原料丟到模子裡(類)熔煉而成;那麼Javascript的物件產生方式就是給材料給建築工(構造函數)讓他按圖紙搭建而成。

實際流程

當然實際流程並不是這樣的,新建一個物件先做的是處理共享資源,例如:
複製程式碼 程式碼如下:

function A(){
console.dir(this);
alert(this .type); //A
}
A.prototype.type = "A";
var a = new A();



透過console.dir將a印出來我們可以看到:
type "A"
__proto__ A {type = "A"}
  type "A"
  constructor A()

建構函式新建一個物件以後,立刻將其prototype的引用賦給新建物件的內部屬性__proto__,然後再執行建構函式裡面的建構語句。

並沒有覆蓋
複製程式碼 程式碼如下:
this.type = "B"
}
A.prototype.type = "A";

var a = new A();
alert(a. type); //B

當我們想要得到a.type時,引擎會先去在a物件中查看是否有屬性type,如果有則傳回該屬性,沒有則試圖在__proto_ _中尋找是否有type屬性,如果有則傳回該屬性。

__proto__並不是標準的,例如IE上沒有,但IE上也有類似的內部屬性,但我們也無法使用它。

基於這個原因,我們刪除a.type時依然可以回傳a.type:

複製程式碼複製程式碼

程式碼如下:


function A(){
this.type = "B"
}
A.prototype.type = "A";

var a = new A();
alert(a.type); //B
delete a.type;
alert(a.type); //A

到底有沒有類?


嚴格地講,Javascript並沒有類別(class)這種東西。
但有時我們會用構造函數的名字作為利用該構造函數創建的對象們的“類型(type not class)名”,以方便我們用Javascript進行面向對象編程時的交流。 名字只是一個代號,一個方便理解的工具罷了。

參考文獻
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脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1

記事本++7.3.1

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

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1317
25
PHP教程
1268
29
C# 教程
1248
24
如何在真我手機上建立資料夾? 如何在真我手機上建立資料夾? Mar 23, 2024 pm 02:30 PM

標題:真我手機新手指南:如何在真我手機上建立資料夾?在現今社會,手機已成為人們生活中不可或缺的工具。而真我手機作為一款備受歡迎的智慧型手機品牌,其簡潔、實用的作業系統備受用戶喜愛。在使用真實我手機的過程中,很多人可能會遇到需要整理手機中的檔案和應用程式的情況,而建立資料夾就是一種有效的方式。本文將介紹如何在真我手機上建立資料夾,幫助使用者更好地管理自己的手機內容。第

如何在GIMP中創造像素藝術 如何在GIMP中創造像素藝術 Feb 19, 2024 pm 03:24 PM

本文將引起您的興趣,如果您有意在Windows上使用GIMP進行像素藝術創作。 GIMP是一款著名的圖形編輯軟體,不僅免費開源,還能幫助使用者輕鬆創造美麗的圖像和設計。除了適用於初學者和專業設計師外,GIMP也可以用於製作像素藝術,這種數位藝術形式是利用像素作為唯一構建塊來進行繪製和創作的。如何在GIMP中建立像素藝術以下是在WindowsPC上使用GIMP建立像素圖片的主要步驟:下載並安裝GIMP,然後啟動應用程式。創造一個新的形象。調整寬度和高度的大小。選擇鉛筆工具。將筆刷類型設定為像素。設定

格力+如何創造家庭 格力+如何創造家庭 Mar 01, 2024 pm 12:40 PM

很多朋友表示想知道在格力+軟體裡該怎麼去創建家庭,下面為大家帶來了操作方法,想要了解的朋友和我一起來看看吧。首先,開啟手機上的格力+軟體,並登入。接著,在頁面底部的選項列中,點選最右邊的「我的」選項,即可進入個人帳戶頁面。 2.來到我的頁面後,在“家庭”下方的選項裡有一個“創建家庭”,找到後在它的上面點擊進入。 3.接下來跳到建立家庭的頁面裡,根據提示在輸入框裡輸入要設定的家庭名稱,輸入好後在右上角點選「儲存」按鈕。 4.最後在頁面下方會彈出一個「儲存成功」的提示,代表家庭已經成功創建好了。

如何創建您的 iPhone 聯絡人海報 如何創建您的 iPhone 聯絡人海報 Mar 02, 2024 am 11:30 AM

在iOS17中,Apple為其常用的「電話」和「通訊錄」應用程式新增了聯絡人海報功能。這項功能允許用戶為每個聯絡人設置個人化的海報,使通訊錄更具視覺化和個人化。聯絡人海報可以幫助用戶更快速地識別和定位特定聯絡人,提高了用戶體驗。透過這項功能,使用者可以根據自己的喜好和需求,為每個聯絡人添加特定的圖片或標識,使通訊錄介面更加生動iOS17中的Apple為iPhone用戶提供了一種新穎的方式來表達自己,並添加了可個性化的聯繫海報。聯絡人海報功能可讓您在呼叫其他iPhone用戶時展示獨特的個人化內容。您

如何使用Highcharts建立甘特圖表 如何使用Highcharts建立甘特圖表 Dec 17, 2023 pm 07:23 PM

如何使用Highcharts建立甘特圖表,需要具體程式碼範例引言:甘特圖是一種常用於展示專案進度和時間管理的圖表形式,能夠直觀地展示任務的開始時間、結束時間和進度。 Highcharts是一款功能強大的JavaScript圖表庫,提供了豐富的圖表類型和靈活的配置選項。本文將介紹如何使用Highcharts建立甘特圖表,並給出具體的程式碼範例。一、Highchart

Django初探:用命令列創建你的首個Django項目 Django初探:用命令列創建你的首個Django項目 Feb 19, 2024 am 09:56 AM

Django專案開啟之旅:從命令列開始,創建你的第一個Django專案Django是一個強大且靈活的網路應用框架,它以Python為基礎,提供了許多開發Web應用所需的工具和功能。本文將帶領你從命令列開始,創建你的第一個Django專案。在開始之前,請確保你已經安裝了Python和Django。步驟一:建立專案目錄首先,開啟命令列窗口,並建立新的目錄

如何將 MySQL 查詢結果陣列轉換為物件? 如何將 MySQL 查詢結果陣列轉換為物件? Apr 29, 2024 pm 01:09 PM

將MySQL查詢結果陣列轉換為物件的方法如下:建立一個空物件陣列。循環結果數組並為每一行建立一個新的物件。使用foreach迴圈將每一行的鍵值對賦給新物件的對應屬性。將新物件加入到物件數組中。關閉資料庫連線。

PHP 函數如何傳回物件? PHP 函數如何傳回物件? Apr 10, 2024 pm 03:18 PM

PHP函數可以透過使用return語句後接物件實例來傳回對象,從而將資料封裝到自訂結構中。語法:functionget_object():object{}。這允許創建具有自訂屬性和方法的對象,並以對象的形式處理資料。

See all articles