摘要:其中,描述符對(duì)象的屬性必須是和。吧設(shè)置為,表示不能從對(duì)象中刪除屬性。這個(gè)方法接收兩個(gè)對(duì)象參數(shù)要添加和修改其屬性值的對(duì)象,第二個(gè)是與第一個(gè)對(duì)象中要添加和修改的屬性值一一對(duì)應(yīng)。
理解對(duì)象 1、創(chuàng)建自定義對(duì)象的兩種方法:
(1)創(chuàng)建一個(gè)Object實(shí)例,然后再為它添加屬性和方法。
var person = new Object(); person.name = "Nicholas"; person.age = 29; person.job = "Software Engineer"; person.sayName = function() { alert(this.name); };
(2)用對(duì)象字面量語法創(chuàng)建 (屬性名或方法名 : 值)
var person = { name : "Nicholas", age : 29, job : "Software Engineer", sayName : function() { alert (this.name); } };2、屬性類型
ECMAScript中有兩種屬性:數(shù)據(jù)屬性和訪問器屬性。
(1)數(shù)據(jù)屬性:數(shù)據(jù)屬性包含一個(gè)數(shù)據(jù)值的位置,在這個(gè)位置可以讀取和寫入值,數(shù)據(jù)屬性有4個(gè)描述其行為的特性:
1)[[Configurable]]:表示能夠通過delect刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為訪問器屬性;
2)[[Enumerable]]:表示能否通過for-in循環(huán)返回屬性;
3)[[Writable]]:表示能否修改屬性的值;
4)[[Value]]:包含這個(gè)屬性的數(shù)據(jù)值。讀取屬性值的時(shí)候,從這個(gè)位置讀;寫入屬性的時(shí)候,把新值保存在這個(gè)位置。
要修改屬性默認(rèn)的特性,必須使用ECMAScript5的Object.defineProperty()方法。這個(gè)方法接收三個(gè)參數(shù):屬性所在的對(duì)象、屬性的名字和一個(gè)描述符對(duì)象。其中,描述符對(duì)象的屬性必須是configurable、enumerable、writable和value。設(shè)置其中的一個(gè)或多個(gè)值,可以修改對(duì)應(yīng)的特征值。
var person = {}; Object.defineProperty(person, "name", { writable : false, value : "Nicholas" }); alert(person.name); //"Nicholas" person.name = "Greg"; alert(person.name); //"Nicholas"
本例中將name屬性的write值設(shè)置為false表示只可讀不可寫。吧configurable設(shè)置為false,表示不能從對(duì)象中刪除屬性。一旦把屬性定義為不可配置的,就不能再把它變回可配置了。
注意:在調(diào)用Object.defineProperty()方法創(chuàng)建一個(gè)新的屬性時(shí),如果不指定,configurable、enumerable和writable特性的默認(rèn)值都是false。
(2)訪問器屬性
訪問器屬性不包含數(shù)據(jù)值:它們包含一對(duì)兒getter和setter函數(shù)。在讀取訪問器屬性時(shí),會(huì)調(diào)用getter函數(shù),這個(gè)函數(shù)負(fù)責(zé)返回有效的值;在寫入訪問器屬性時(shí),會(huì)調(diào)用setter函數(shù)并傳入新值,這個(gè)函數(shù)負(fù)責(zé)決定如何讓處理數(shù)據(jù)。訪問器屬性有如下4個(gè)特性:
1)[[Configurable]]:表示能夠通過delect刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為數(shù)據(jù)屬性;
2)[[Enumerable]]:表示能否通過for-in循環(huán)返回屬性;
3)[[Get]]:在讀取屬性時(shí)調(diào)用的函數(shù)。默認(rèn)值為Undefined。
4)[[Set]]:在寫入屬性時(shí)調(diào)用的函數(shù)。默認(rèn)值為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前面的下劃線是一種常用的記號(hào),用于表示只能通過對(duì)象方法訪問的屬性。
3、定義多個(gè)屬性Object.defineProperties()方法。利用這個(gè)方法可以通過描述符一次定義多個(gè)屬性。這個(gè)方法接收兩個(gè)對(duì)象參數(shù):要添加和修改其屬性值的對(duì)象,第二個(gè)是與第一個(gè)對(duì)象中要添加和修改的屬性值一一對(duì)應(yīng)。
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對(duì)象上定義了兩個(gè)數(shù)據(jù)屬性(_year和edition)和一個(gè)訪問器屬性(year)。
4、讀取屬性的特性Object.getOwnPropertyDescriptor()方法,可以去的給定屬性的描述符。這個(gè)方法接收兩個(gè)參數(shù):屬性所在的對(duì)象和要讀取其描述符的屬性名稱,返回值是一個(gè)對(duì)象。
如果是訪問器屬性,這個(gè)對(duì)象的屬性有configurable、 enumerable、get和set;
如果是數(shù)據(jù)屬性,這個(gè)對(duì)象的屬性有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"
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/109024.html
摘要:就是通過調(diào)用構(gòu)造函數(shù)而創(chuàng)建的那個(gè)對(duì)象實(shí)例的原型對(duì)象。創(chuàng)建要返回的對(duì)象可以在這里定義私有變量和函數(shù)添加函數(shù)注意寄生構(gòu)造函數(shù)中是返回對(duì)象注意寄生構(gòu)造函數(shù)中是注意,在以這種模式創(chuàng)建的對(duì)象中,除了使用方法之外,沒有其他辦法訪問的值。 一、工廠模式 function createPerson(name, age, job) { var o = new Object(); o.na...
摘要:除此之外,在超類型的原型中定義的方法,對(duì)子類型而言也是不可兼得,結(jié)果所有類型都只能用構(gòu)造函數(shù)模式。創(chuàng)建對(duì)象增強(qiáng)對(duì)象指定對(duì)象繼承屬性這個(gè)例子的高效率體現(xiàn)在它只調(diào)用了一次構(gòu)造函數(shù)。 1、原型鏈 原型鏈的基本思想是利用原型讓一個(gè)引用類型繼承另一個(gè)引用類型的屬性和方法。構(gòu)造函數(shù)、原型和實(shí)例的關(guān)系:每個(gè)構(gòu)造函數(shù)都有一個(gè)原型對(duì)象;原型對(duì)象都包含著一個(gè)指向構(gòu)造函數(shù)的指針;實(shí)例都包含一個(gè)指向原型對(duì)象的...
摘要:此時(shí)的原型對(duì)象包括一個(gè)指向另一個(gè)原型的指針,相應(yīng)的,另一個(gè)原型中的指向另一個(gè)構(gòu)造函數(shù)。這種關(guān)系層層遞進(jìn),就通過一個(gè)原型對(duì)象鏈接另一個(gè)構(gòu)造函數(shù)的原型對(duì)象的方式實(shí)現(xiàn)了繼承。 讀這篇之前,最好是已讀過我前面的關(guān)于對(duì)象的理解和封裝類的筆記。第6章我一共寫了3篇總結(jié),下面是相關(guān)鏈接:讀《javaScript高級(jí)程序設(shè)計(jì)-第6章》之理解對(duì)象讀《javaScript高級(jí)程序設(shè)計(jì)-第6章》之封裝類 一...
摘要:把對(duì)象定義為無序?qū)傩缘募希鋵傩钥梢园局祵?duì)象或函數(shù)。接受兩個(gè)參數(shù)屬性所在的對(duì)象和要讀取其特性的屬性名返回的時(shí)其特性的對(duì)象例如讀高級(jí)程序設(shè)計(jì)這本書的第章面向?qū)ο蟮某绦蛟O(shè)計(jì),我做了篇筆記。這是第一篇,后面還有兩篇,分別是封裝類和繼承。 ECMA-262把對(duì)象定義為:無序?qū)傩缘募?,其屬性可以包含基本值、?duì)象或函數(shù)。所以,我們可以理解對(duì)象就是名值對(duì)的集合,名就是對(duì)象的每個(gè)屬性的名字,...
摘要:創(chuàng)建構(gòu)造函數(shù)后,其原型對(duì)象默認(rèn)只會(huì)取得屬性至于其他的方法都是從繼承來的。上圖展示了構(gòu)造函數(shù)的原型對(duì)象和現(xiàn)有的兩個(gè)實(shí)例之間的關(guān)系。所有原生的引用類型都在其構(gòu)造函數(shù)的原型上定義了方法。 第6章我一共寫了3篇總結(jié),下面是相關(guān)鏈接:讀《javaScript高級(jí)程序設(shè)計(jì)-第6章》之理解對(duì)象讀《javaScript高級(jí)程序設(shè)計(jì)-第6章》之繼承 工廠模式 所謂的工廠模式就是,把創(chuàng)建具體對(duì)象的過程抽象...
閱讀 2122·2023-04-26 00:50
閱讀 2494·2021-10-13 09:39
閱讀 2229·2021-09-22 15:34
閱讀 1624·2021-09-04 16:41
閱讀 1350·2019-08-30 15:55
閱讀 2446·2019-08-30 15:53
閱讀 1720·2019-08-30 15:52
閱讀 756·2019-08-29 16:19