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