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