摘要:面向對象面向對象編程的全稱為簡稱。面向對象編程是用抽象方式創建基于現實世界模型的一種編程方式。面向對象編程可以看做是使用一系列對象相互協作的軟件設計。面向對象編程的三個主要特征是封裝繼承多態。
面向對象
面向對象編程的全稱為Object Oriented Programming,簡稱OOP。面向對象編程是用抽象方式創建基于現實世界模型的一種編程方式。
面向對象編程可以看做是使用一系列對象相互協作的軟件設計。面向對象編程的三個主要特征是:封裝、繼承、多態。
所謂封裝就是按照要求使用并得到對應的結果,而不需要知道真實的執行原理。
封裝主要用于闡述對象中包含的(封裝的)內容,通常有兩部分組成
相關的數據(用于存儲屬性)
基于這些數據所能做的事
繼承繼承通常是指類與類之間的關系。如果兩個類有相同的屬性或方法,那么可以讓一個類繼承另一個類,就不需要再次定義相同的屬性或方法。
創建一個或多個類的專門版本類方式稱為繼承(JavaScript只支持單體繼承)。創建的專門版本的類通常叫做子類,另外的類通常叫做父類。
不同的對象可以定義相同名稱的方法,方法作用于所在的對象中。這種不同對象通過相同方法的調用實現各自行為的能力,被稱之為多態。
構造函數構造函數又被稱為構造器或對象模板,是對象的一個方法,在實例化時構造器被調用。在JavaScript中函數就可以作為構造器使用。
/* 創建構造函數->用于創建對象 * function 構造函數名稱(){ * this.屬性名 = 屬性值 * this.方法名 = function(){ * 方法體 * } * } this關鍵字指代利用當前構造函數創建的對象*/ function Dog() {//這是構造函數,構造函數的屬性和方法使用this關鍵字 this.name=function () { console.log("哈士奇") } } /* 利用構造函數創建對象*/ var dog = new Dog(); console.log(dog);Object類型 屬性描述符
JavaScript提供了一個內部數據結構,用于描述對象的值,控制其行為,例如該屬性是否可寫,是否可配置,是否可刪除,是否可枚舉等,這個內部數據結構被稱為屬性描述符。
對象里目前存在的屬性描述符主要有兩種形式:數據描述符和存取描述符。
數據描述符是一個具有值的屬性,該值可能是可寫的,也可能是不可寫的。數據描述符具有以下可選鍵值:
value:該屬性對應的值。可以是任何有效的JavaScript值。默認為undefined、
writable:當且僅當屬性的writable為true時,value才能被賦值運算符改變。默認為false。
configurable:當且僅當該屬性的configurable為true時,該屬性描述符才能被改變,同時該屬性也能從對應的對象上被刪除。默認為false。
enumerable:當且僅當該屬性的enumerable為true時,該屬性才能夠出現在對象的枚舉屬性中,默認為false。
存取描述符存取描述符是由getter-setter函數對描述的屬性。有以下可選鍵值
get:給屬性提供getter的方法,如果沒有getter則為undefined。當訪問該屬性時,該方法會被執行,方法執行時沒有參數傳入,但是會傳入this對象。
set:給屬性提供setter的方法,如果沒有setter則為undefined。當屬性修改時,觸發執行該方法。該方法接受唯一參數,即改屬性新的參數值。
configurable:當且僅當該屬性的configurable為true時,該屬性描述符才能被改變,同時該屬性也能從對應的對象上被刪除。默認為false。
enumerable:當且僅當該屬性的enumerable為true時,該屬性才能夠出現在對象的枚舉屬性中,默認為false。
獲取屬性描述符Object.getOwnPropentyDescriptor()方法返回指定對象上一個自有屬性對應的屬性描述符
var obj = { name : "哈士奇" } /* 使用Object.getOwnPropertyDescriptor()方法獲取指定屬性的描述符 Object.getOwnPropertyDescriptor(obj,prop) * obj - 表示指定屬性對應的目標對象 * prop - 表示獲取描述符的目標屬性名稱 * 返回值 - 其屬性描述符對象 * 如果 */ var v =Object.getOwnPropertyDescriptor(obj,"name"); console.log(v)設置屬性描述符可選鍵值value
Object.deginepropety()方法為對象定義新屬性或修改現有屬性,并返回該對象。
var obj ={//定義對象時定義的屬性是可以修改、刪除、枚舉的 name : "阿拉斯加" } /* Object.defineProperty(obj, prop, descriptor)方法 * 作用 * 用于定義目標對象的新屬性 * 用于修改目標對象的已存在屬性 * 參數 * obj - 表示目標對象 * prop - 表示目標對象的目標屬性名稱 * descriptor - 表示屬性描述符,必須是對象格式 { value : 值 } * 返回值 - 返回傳遞的對象 */ //修改name屬性 Object.defineProperty(obj, "name",{ value:"哈士奇" } ); console.log(obj.name);//哈士奇 /* 同樣都是為對象新增屬性 1.如果直接使用 "對象名.屬性名 = 值" -> 可修改、可刪除以及可枚舉的 2.如果使用Object.defineProperty()方法新增屬性 * 該新屬性是不可修改、不可刪除以及不可枚舉的 */ //新增age屬性//用該方法新增的屬性默認是不可以修改、刪除、枚舉的 Object.defineProperty(obj,"age",{ value : 2 });
Object.degineproperties()方法為對象定義一個或多個新屬性或修改現有屬性,并返回該值。
設置屬性描述符可選鍵值weitablevar obj = { // 定義對象的同時定義了該屬性以及值(可修改、可刪除以及可枚舉的) name : "張無忌" } // 修改現有屬性 Object.defineProperty(obj, "name", { value : "周芷若", writable : false // 不可修改 }); console.log(obj.name);// 周芷若 // 修改name屬性值 obj.name = "趙敏"; console.log(obj.name);// 周芷若 Object.defineProperty(obj, "age", { value : 18, writable : true }); console.log(obj.age);// 18 // 修改age屬性值 obj.age = 80; console.log(obj.age);// 80
設置屬性描述符可選鍵值configuarble
var obj = { // 定義對象的同時定義了該屬性以及值(可修改、可刪除以及可枚舉的) name : "張無忌" } // 修改現有屬性 Object.defineProperty(obj, "name", { value : "周芷若", writable : true, // 控制當前屬性是否可被修改 configurable : true // 控制當前屬性是否可被刪除 }); console.log(obj.name);// 周芷若 // 修改name屬性值 obj.name = "趙敏"; console.log(obj.name);// 趙敏 // 刪除name屬性值 delete obj.name;undefined console.log(obj.name);// undefined設置屬性描述符enumerable
var obj = { // 定義對象的同時定義了該屬性以及值(可修改、可刪除以及可枚舉的) name : "張無忌" } Object.defineProperty(obj, "name", { value : "周芷若", enumerable : false }); console.log(obj.name);// 周芷若 /* 屬性描述符enumerable - 控制當前屬性是否可被枚舉(遍歷) * 僅能循環遍歷對象中可被枚舉的屬性 * for...in語句 * keys()方法 * 可以循環遍歷對象中可被枚舉和不可被枚舉的屬性 * getOwnPropertyNames()方法 */ for (var i in obj) { console.log(i); } var result1 = Object.keys(obj); console.log(result1); var result2 = Object.getOwnPropertyNames(obj); console.log(result2);設置屬性描述符存取器
對象中的屬性除了可以直接定義外,還可以用存取器進行定義。setter為取值函數,使用屬性描述符中的set;getter為取值函數,使用屬性描述符中的get。
var value; var obj = { // 存取描述符中的get get attr() {// 表示當前目標屬性名稱 return value; }, // 存取描述符中的set set attr(newValue) {// 表示當前目標屬性名稱 console.log("setter: " + newValue); value = newValue; } } console.log(obj.attr);// undefined obj.attr = 100;// "setter: 100"防篡改對象
定義的對象默認在任何時候任何位置都可以隨意修改,所以添加了防止篡改的機制分為三個級別
禁止擴展:禁止為對象擴展新的屬性和方法
密封對象:只允許讀寫屬性的值
凍結對象:禁止任何操作
禁止擴展Object.preventExtensions()設置指定對象不可擴展
Object.isExtensible()判斷一個對象是否可以擴展
密封對象Objet.seal()方法用于密封一個對象,防止添加新屬性并將現有屬性標記為不可配置,當前屬性的值可寫。
Object.Sealead()判斷對象是否被密封
凍結對象Object.freeze()用于凍結一個對象,無法對這個對象進行任何操作,只可讀
Object.isFrozen()判斷對象是否被凍結
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/108198.html
摘要:在中,并沒有對抽象類和接口的支持。例如,當對象需要對象的能力時,可以有選擇地把對象的構造器的原型指向對象,從而達到繼承的效果。本節內容為設計模式與開發實踐第一章筆記。 動態類型語言 編程語言按數據類型大體可以分為兩類:靜態類型語言與動態類型語言。 靜態類型語言在編譯時已確定變量類型,動態類型語言的變量類型要到程序運行時,待變量被賦值后,才具有某種類型。 而JavaScript是一門典型...
摘要:很多情況下,通常一個人類,即創建了一個具體的對象。對象就是數據,對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個人類,即創建了一個具體的對象。對象就是數據,對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個人類,即創建了一個具體的對象。對象就是數據,對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:有一函數若是用來生成對象,則稱為構造函數名。屬性指定了使用該構造函數生成的對象實例繼承了哪個對象實例。因此,只要利用,就能在構造函數中,為未來利用此構造函數生成的對象實例,添加成員屬性和成員方法了。 與其它編程語言不一樣的是,javascript的面向對象并非依賴于抽象的類,而是通過原型鏈,將一個個具體的對象實例進行連接,位于原型鏈下游的對象實例可以讀取/使用位于上游的對象實例的屬性/...
摘要:雖然,也是面向疾苦的語言,但是,它和靜態類型語言的面向接口編程不一而足。對象對他自己的行為負責,其他對象不關心它的內部實現。 ‘工欲善其事,必先利其器’,在深入學習JavaScript之前,我認為我們很有必要了解以下,JavaScript這門面向對象的動態語言到底是一門什么樣的語言。 JavaScript vs 其他面向對象語言 它沒有使用像Java等傳統的面向對象語言的類式繼承,而...
閱讀 1711·2021-11-22 12:09
閱讀 1451·2019-08-30 13:22
閱讀 2083·2019-08-29 17:00
閱讀 2634·2019-08-29 16:28
閱讀 2945·2019-08-26 13:51
閱讀 1174·2019-08-26 13:25
閱讀 3237·2019-08-26 12:14
閱讀 3006·2019-08-26 12:14