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

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
C和JavaScript:連接解釋C和JavaScript:連接解釋Apr 23, 2025 am 12:07 AM

C 和JavaScript通過WebAssembly實現互操作性。 1)C 代碼編譯成WebAssembly模塊,引入到JavaScript環境中,增強計算能力。 2)在遊戲開發中,C 處理物理引擎和圖形渲染,JavaScript負責遊戲邏輯和用戶界面。

從網站到應用程序:JavaScript的不同應用從網站到應用程序:JavaScript的不同應用Apr 22, 2025 am 12:02 AM

JavaScript在網站、移動應用、桌面應用和服務器端編程中均有廣泛應用。 1)在網站開發中,JavaScript與HTML、CSS一起操作DOM,實現動態效果,並支持如jQuery、React等框架。 2)通過ReactNative和Ionic,JavaScript用於開發跨平台移動應用。 3)Electron框架使JavaScript能構建桌面應用。 4)Node.js讓JavaScript在服務器端運行,支持高並發請求。

Python vs. JavaScript:比較用例和應用程序Python vs. JavaScript:比較用例和應用程序Apr 21, 2025 am 12:01 AM

Python更適合數據科學和自動化,JavaScript更適合前端和全棧開發。 1.Python在數據科學和機器學習中表現出色,使用NumPy、Pandas等庫進行數據處理和建模。 2.Python在自動化和腳本編寫方面簡潔高效。 3.JavaScript在前端開發中不可或缺,用於構建動態網頁和單頁面應用。 4.JavaScript通過Node.js在後端開發中發揮作用,支持全棧開發。

C/C在JavaScript口譯員和編譯器中的作用C/C在JavaScript口譯員和編譯器中的作用Apr 20, 2025 am 12:01 AM

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。1)C 用于解析JavaScript源码并生成抽象语法树。2)C 负责生成和执行字节码。3)C 实现JIT编译器,在运行时优化和编译热点代码,显著提高JavaScript的执行效率。

JavaScript在行動中:現實世界中的示例和項目JavaScript在行動中:現實世界中的示例和項目Apr 19, 2025 am 12:13 AM

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

JavaScript和Web:核心功能和用例JavaScript和Web:核心功能和用例Apr 18, 2025 am 12:19 AM

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

了解JavaScript引擎:實施詳細信息了解JavaScript引擎:實施詳細信息Apr 17, 2025 am 12:05 AM

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python vs. JavaScript:學習曲線和易用性Python vs. JavaScript:學習曲線和易用性Apr 16, 2025 am 12:12 AM

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

See all articles

熱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

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

熱工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

SublimeText3 Mac版

SublimeText3 Mac版

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