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