摘要:其中,描述符對象的屬性必須是和。吧設置為,表示不能從對象中刪除屬性。這個方法接收兩個對象參數要添加和修改其屬性值的對象,第二個是與第一個對象中要添加和修改的屬性值一一對應。
理解對象 1、創建自定義對象的兩種方法:
(1)創建一個Object實例,然后再為它添加屬性和方法。
var person = new Object(); person.name = "Nicholas"; person.age = 29; person.job = "Software Engineer"; person.sayName = function() { alert(this.name); };
(2)用對象字面量語法創建 (屬性名或方法名 : 值)
var person = { name : "Nicholas", age : 29, job : "Software Engineer", sayName : function() { alert (this.name); } };2、屬性類型
ECMAScript中有兩種屬性:數據屬性和訪問器屬性。
(1)數據屬性:數據屬性包含一個數據值的位置,在這個位置可以讀取和寫入值,數據屬性有4個描述其行為的特性:
1)[[Configurable]]:表示能夠通過delect刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為訪問器屬性;
2)[[Enumerable]]:表示能否通過for-in循環返回屬性;
3)[[Writable]]:表示能否修改屬性的值;
4)[[Value]]:包含這個屬性的數據值。讀取屬性值的時候,從這個位置讀;寫入屬性的時候,把新值保存在這個位置。
要修改屬性默認的特性,必須使用ECMAScript5的Object.defineProperty()方法。這個方法接收三個參數:屬性所在的對象、屬性的名字和一個描述符對象。其中,描述符對象的屬性必須是configurable、enumerable、writable和value。設置其中的一個或多個值,可以修改對應的特征值。
var person = {}; Object.defineProperty(person, "name", { writable : false, value : "Nicholas" }); alert(person.name); //"Nicholas" person.name = "Greg"; alert(person.name); //"Nicholas"
本例中將name屬性的write值設置為false表示只可讀不可寫。吧configurable設置為false,表示不能從對象中刪除屬性。一旦把屬性定義為不可配置的,就不能再把它變回可配置了。
注意:在調用Object.defineProperty()方法創建一個新的屬性時,如果不指定,configurable、enumerable和writable特性的默認值都是false。
(2)訪問器屬性
訪問器屬性不包含數據值:它們包含一對兒getter和setter函數。在讀取訪問器屬性時,會調用getter函數,這個函數負責返回有效的值;在寫入訪問器屬性時,會調用setter函數并傳入新值,這個函數負責決定如何讓處理數據。訪問器屬性有如下4個特性:
1)[[Configurable]]:表示能夠通過delect刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為數據屬性;
2)[[Enumerable]]:表示能否通過for-in循環返回屬性;
3)[[Get]]:在讀取屬性時調用的函數。默認值為Undefined。
4)[[Set]]:在寫入屬性時調用的函數。默認值為Undefined。
訪問器屬性不能直接定義,必須使用Object.defineProperty()來定義。
object.defineProperty(book,"year", { ger : function() { return this._year; }, set : function(newValue) { if(newValue > 2004) { this._year = newValue; this.edition += newValue - 2004; } } }); book.year = 2005; alert(book.edition); //2
_year前面的下劃線是一種常用的記號,用于表示只能通過對象方法訪問的屬性。
3、定義多個屬性Object.defineProperties()方法。利用這個方法可以通過描述符一次定義多個屬性。這個方法接收兩個對象參數:要添加和修改其屬性值的對象,第二個是與第一個對象中要添加和修改的屬性值一一對應。
var book = {}; Object.defineProperties(book, { _year: { writable : true, value : 2004 }, edition: { writable: true, value: 1 }, year: { get: function() { return this._year; }, set: function(newValue) { if(newValue > 2004) { this._year = newValue; this.edition += newValue - 2004; } } } });
以上代碼在book對象上定義了兩個數據屬性(_year和edition)和一個訪問器屬性(year)。
4、讀取屬性的特性Object.getOwnPropertyDescriptor()方法,可以去的給定屬性的描述符。這個方法接收兩個參數:屬性所在的對象和要讀取其描述符的屬性名稱,返回值是一個對象。
如果是訪問器屬性,這個對象的屬性有configurable、 enumerable、get和set;
如果是數據屬性,這個對象的屬性有configurable、enumerable、writable和value。
var book = {}; Object.defineProperties(book, { _year: { writable : true, value : 2004 }, edition: { writable: true, value: 1 }, year: { get: function() { return this._year; }, set: function(newValue) { if(newValue > 2004) { this._year = newValue; this.edition += newValue - 2004; } } } }); var descriptor = Object.getOwnPropertyDescriptor(book, "_year"); alert(descriptor.value); //2004 alert(descriptor.configurable); //false alter(typeof descriptor.get); //undefined var descriptor = Object.getOwnPropertyDescriptor(book, "year"); alert(descriptor.value); //undefined alert(descriptor.enumerable); //false alert(typeof descriptor.get); //"function"
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/109024.html
摘要:就是通過調用構造函數而創建的那個對象實例的原型對象。創建要返回的對象可以在這里定義私有變量和函數添加函數注意寄生構造函數中是返回對象注意寄生構造函數中是注意,在以這種模式創建的對象中,除了使用方法之外,沒有其他辦法訪問的值。 一、工廠模式 function createPerson(name, age, job) { var o = new Object(); o.na...
摘要:除此之外,在超類型的原型中定義的方法,對子類型而言也是不可兼得,結果所有類型都只能用構造函數模式。創建對象增強對象指定對象繼承屬性這個例子的高效率體現在它只調用了一次構造函數。 1、原型鏈 原型鏈的基本思想是利用原型讓一個引用類型繼承另一個引用類型的屬性和方法。構造函數、原型和實例的關系:每個構造函數都有一個原型對象;原型對象都包含著一個指向構造函數的指針;實例都包含一個指向原型對象的...
摘要:此時的原型對象包括一個指向另一個原型的指針,相應的,另一個原型中的指向另一個構造函數。這種關系層層遞進,就通過一個原型對象鏈接另一個構造函數的原型對象的方式實現了繼承。 讀這篇之前,最好是已讀過我前面的關于對象的理解和封裝類的筆記。第6章我一共寫了3篇總結,下面是相關鏈接:讀《javaScript高級程序設計-第6章》之理解對象讀《javaScript高級程序設計-第6章》之封裝類 一...
摘要:把對象定義為無序屬性的集合,其屬性可以包含基本值對象或函數。接受兩個參數屬性所在的對象和要讀取其特性的屬性名返回的時其特性的對象例如讀高級程序設計這本書的第章面向對象的程序設計,我做了篇筆記。這是第一篇,后面還有兩篇,分別是封裝類和繼承。 ECMA-262把對象定義為:無序屬性的集合,其屬性可以包含基本值、對象或函數。所以,我們可以理解對象就是名值對的集合,名就是對象的每個屬性的名字,...
摘要:創建構造函數后,其原型對象默認只會取得屬性至于其他的方法都是從繼承來的。上圖展示了構造函數的原型對象和現有的兩個實例之間的關系。所有原生的引用類型都在其構造函數的原型上定義了方法。 第6章我一共寫了3篇總結,下面是相關鏈接:讀《javaScript高級程序設計-第6章》之理解對象讀《javaScript高級程序設計-第6章》之繼承 工廠模式 所謂的工廠模式就是,把創建具體對象的過程抽象...
閱讀 2117·2023-04-26 00:50
閱讀 2488·2021-10-13 09:39
閱讀 2221·2021-09-22 15:34
閱讀 1613·2021-09-04 16:41
閱讀 1343·2019-08-30 15:55
閱讀 2441·2019-08-30 15:53
閱讀 1714·2019-08-30 15:52
閱讀 754·2019-08-29 16:19