摘要:為要檢測(cè)的對(duì)象構(gòu)造函數(shù)創(chuàng)建的對(duì)象繼承了一個(gè)叫的屬性,該屬性指代該構(gòu)造函數(shù),即的原型。使用直接量創(chuàng)建的對(duì)象,也有一個(gè)叫的屬性,該屬性指代構(gòu)造函數(shù),所以直接量創(chuàng)建的對(duì)象的真正原型是,使用方法來(lái)檢測(cè)對(duì)象的原型并不可靠,在以后的文章中會(huì)提到。
一、原型屬性
1、對(duì)象的原型屬性是用來(lái)繼承屬性的,這個(gè)屬性如此重要,我們通常稱為:對(duì)象的原型屬性或?qū)ο蟮脑汀?br>對(duì)象的原型是在對(duì)象實(shí)例化的時(shí)候就設(shè)置好的:
(1)、通過(guò)對(duì)象直接量創(chuàng)建的對(duì)象的原型是Object.prototype
(2)、通過(guò)(new+構(gòu)造函數(shù))的方式創(chuàng)建的對(duì)象的原型是(構(gòu)造函數(shù)的prototype屬性) 如:var arr=new Array(),arr的原型是:Array.prototype
(3)、通過(guò)new create(),創(chuàng)建的對(duì)象的原型是該方法的第一個(gè)參數(shù),如: var obj=new create(o);obj的原型是o
2、檢測(cè)對(duì)象的原型方法:
1、o.isPrototypeOf(p),(o為原型,p為要檢測(cè)的對(duì)象):
var o={x:0,y:1}; var p=new create(o); o.isPrototypeOf(p); //true Object.prototype.isPrototypeOf(p); //true
上面例子中通過(guò)new create()創(chuàng)建對(duì)象,o作為p的原型,o為字面兩創(chuàng)建的對(duì)象,o的原型是Object.prototype,
p繼承了o的屬性,o繼承了Object.prototype的屬性,所以p繼承了o和Object.prototype的屬性,形成了一個(gè)原型鏈,所以Object.prototype是p的原型(可以理解為最上游的原型)。
2、o.constructor.prototype,(o為要檢測(cè)的對(duì)象):
new+構(gòu)造函數(shù)創(chuàng)建的對(duì)象繼承了一個(gè)叫constructor的屬性,該屬性指代該構(gòu)造函數(shù),o.constructor.prototype即o的原型。使用直接量創(chuàng)建的對(duì)象,也有一個(gè)叫constructor的屬性,該屬性指代Object構(gòu)造函數(shù),所以直接量創(chuàng)建的對(duì)象的真正原型是:o.constructor.prototype,使用o.constructor.prototype方法來(lái)檢測(cè)對(duì)象的原型并不可靠,在以后的文章中會(huì)提到。
3、在ECMAScript5中,Object.getPrototypeOf(o)這個(gè)方法來(lái)獲取對(duì)象的原型,這個(gè)方法IE8及以下不支持。
二、類屬性
對(duì)象的類屬性(class)是一個(gè)字符串,ECMAScript3和ECMAScript5沒(méi)有提供設(shè)置對(duì)象類的方法,有一種間接的方法訪問(wèn)對(duì)象類的屬性:toString(),該方法繼承自Object.prototype返回字符串"[Object class]",我們只要取返回字符串的下標(biāo)為8到-1的字符串就獲取了對(duì)象的類屬性class了,但是有很多的自定義對(duì)象重寫了toString()方法,獲取對(duì)象的類屬性時(shí)須調(diào)用Function.call()方法,下面是返回任意對(duì)象的類屬性的classOf()函數(shù):
function classOf(o){ if(o===null) return "Null"; if(o===undefined) return "Undefined"; return Object.prototype.toString().call(o).slice(8,-1); } classOf(1); //"Number" classOf(""); //"String" classOf(new Array()); //"Array" classOf(new Date()); //"Date" classOf(new RegExp()); //"RegExp" classOf(true); //"Boolean" classOf({}); //"Object" classOf(window); //"window"(客戶端的宿主對(duì)象) function F(){} //自定義一個(gè)構(gòu)造函數(shù) classOf(new F()); //"Object",對(duì)于自定義的對(duì)象無(wú)法區(qū)分類
三、可擴(kuò)展性
對(duì)象的可擴(kuò)展性表示對(duì)象是否可以添加新的屬性,內(nèi)置對(duì)象和自定義對(duì)象默認(rèn)都是可擴(kuò)展的,可以通過(guò)方法設(shè)置為不可擴(kuò)展的,宿主對(duì)象的可擴(kuò)展性是由javascript的引擎定義的。
1、查詢對(duì)象的可擴(kuò)展性,Object.isExtensible(),參數(shù)傳入要查詢的對(duì)象,如:
var obj={}; Object.isExtensible(obj); //該方法IE8及以下不支持
2、設(shè)置對(duì)象的可擴(kuò)展性,
(1)、Object.preventExtensions(),參數(shù)傳入要設(shè)置的對(duì)象,一旦對(duì)象的可擴(kuò)展性設(shè)置為不可擴(kuò)展的,就無(wú)法復(fù)原為可擴(kuò)展的了,但不影響對(duì)象的繼承屬性,通過(guò)在對(duì)象的原型中添加屬性,這個(gè)不可擴(kuò)展的對(duì)象任然會(huì)繼承原型新添加的屬性。使用該方法后,對(duì)象:不可擴(kuò)展、可配置、可寫。(可枚舉不受影響,存取器屬性不受影響)
(2)、Object.seal(),參數(shù)傳入要設(shè)置的對(duì)象,該方法可設(shè)置對(duì)象為不可擴(kuò)展的和對(duì)象的屬性是不可配置的,也就是說(shuō)對(duì)象不能添加新的屬性,不能配置和刪除該對(duì)象屬性,但是該對(duì)象的可寫的屬性任然可以設(shè)置。使用該方法后,對(duì)象:不可擴(kuò)展、不可配置、可寫。(可枚舉不受影響,存取器屬性不受影響)
(3)、Object.freeze(),參數(shù)傳入要設(shè)置的對(duì)象,"凍結(jié)"對(duì)象,使用該方法后,對(duì)象:不可擴(kuò)展、不可配置、不可寫。(可枚舉不受影響,存取器屬性不受影響)
var obj=Object.seal(Object.create(Object.freeze({x:1}),{ y:{value:2,writable:true}, z:{value:3,writable:true} })); obj.x=-1; obj.y=-2 obj.x; //1,Object.freeze({x:1});設(shè)置該對(duì)象不可擴(kuò)展、不可配置、不可寫 obj.y;//-2,Object.seal(),設(shè)置該對(duì)象為不可擴(kuò)展、不可配置、沒(méi)有設(shè)置對(duì)象的可寫性
上面例子中Object.create()創(chuàng)建了一個(gè)對(duì)象原型是Object.freeze({x:1});原型是不可擴(kuò)展的,繼承屬性x不可配置,不可寫。自有屬性有y和z,y、z的屬性描述符如例子中所示,是可寫的,不可配置,不可枚舉,Object.seal()傳入了創(chuàng)建的對(duì)象,使得對(duì)象:不可擴(kuò)展,對(duì)象里面的屬性:不可配置,但沒(méi)有影響可寫性和可枚舉性。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/91289.html
摘要:對(duì)象序列化是指對(duì)象狀態(tài)轉(zhuǎn)為字符串,也可以將字符串還原為對(duì)象。提供了和兩個(gè)方法使用該方法序列化對(duì)象。只能序列化對(duì)象的可枚舉的屬性,對(duì)于一個(gè)不能序列化的屬性將在對(duì)象序列化后生成的字符串中省略掉這個(gè)屬性。 對(duì)象序列化是指對(duì)象狀態(tài)轉(zhuǎn)為字符串,也可以將字符串還原為對(duì)象。ECMAScript5提供了JSON.stringify()和JSON.parse()兩個(gè)方法:1、JSON.stringify...
摘要:一認(rèn)識(shí)數(shù)組數(shù)組是值的有序集合。每一個(gè)值叫一個(gè)元素,每一個(gè)元素在數(shù)組中有一個(gè)位置,以數(shù)字表示,叫做索引。數(shù)組的索引類似于對(duì)象的屬性名等價(jià)于每個(gè)實(shí)例數(shù)組都繼承自中的屬性。構(gòu)造函數(shù)傳入多個(gè)參數(shù)時(shí)參數(shù)為元素。 一、認(rèn)識(shí)數(shù)組數(shù)組是值的有序集合。每一個(gè)值叫一個(gè)元素,每一個(gè)元素在數(shù)組中有一個(gè)位置,以數(shù)字表示,叫做索引。第一個(gè)元素的索引為0,數(shù)組有一個(gè)length屬性,為數(shù)組的元素個(gè)數(shù),length比...
摘要:一循環(huán)使用參數(shù)為對(duì)象,返回一個(gè)數(shù)組,為對(duì)象屬性名的集合不可枚舉的除外。 數(shù)組循環(huán)數(shù)組循環(huán)方法:for循環(huán),forEach(),for/in。一、for循環(huán)1.使用Object.keys()參數(shù)為對(duì)象,返回一個(gè)數(shù)組,為對(duì)象屬性名的集合(不可枚舉的除外)。IE8+,然后使用for循環(huán)得到對(duì)象的值的集合。 var o={a:1,b:2,c:3}; Object.defineProperty(...
摘要:索引刪除某個(gè)元素,數(shù)組不變理解數(shù)組是特殊的對(duì)象,轉(zhuǎn)變成稍后章節(jié)中介紹數(shù)組的其他方法 一、數(shù)組元素的添加 var arr=[];//創(chuàng)建一個(gè)空數(shù)組 arr[0]=0;//給arr添加第一個(gè)元素 arr[0]=1;//修改arr第一個(gè)元素 arr.push(1);//給arr末尾添加一個(gè)元素 arr.unshift(-1);//給arr前面添加一個(gè)元素 二、數(shù)組元素的修改 var arr=...
摘要:兼容獲取指定對(duì)象下具有指定類名的對(duì)象參數(shù)為父節(jié)點(diǎn)對(duì)象,為類名當(dāng)沒(méi)有傳入指定的父節(jié)點(diǎn)對(duì)象時(shí)默認(rèn)獲取下所有的指定類事件綁定兼容需要綁定事件的元素,事件類型,執(zhí)行函數(shù)級(jí)及以下級(jí) 1、兼容獲取指定DOM對(duì)象下具有指定類名的DOM對(duì)象 //參數(shù):parentNode為父節(jié)點(diǎn)對(duì)象,className為class類名 //當(dāng)沒(méi)有傳入指定的父節(jié)點(diǎn)對(duì)象時(shí),默認(rèn)獲取document下所有的指定類 func...
閱讀 1235·2021-11-10 11:35
閱讀 2981·2021-09-24 10:35
閱讀 3007·2021-09-22 15:38
閱讀 2856·2019-08-30 15:43
閱讀 1381·2019-08-29 18:39
閱讀 2637·2019-08-29 15:22
閱讀 2828·2019-08-28 18:17
閱讀 643·2019-08-26 13:37