JavaScript基本概念(對象)

1.對象的分類javascript

  • 內置對象:由ECMAScript規範定義的對象或類
  • 宿主對線:由瀏覽器定義的對象
  • 自定義對象:由運行中的Javascript代碼建立的對象

 

2.屬性的分類java

  • 自有屬性:直接在對象中定義的屬性
  • 繼承屬性:來自對象的原型對象中定義的屬性

 

3.建立對象的方式瀏覽器

  • 對象直接量
  • 經過new建立對象
  • 經過Object.create()建立對象(ECMAScript5),示例代碼以下
// 建立一個以普通對象爲原型的對象
var o1 = Object.create({x:1,y:2});
// 建立一個沒有原型的對線
var o2 = Object.create(null);
// 建立以Object.prototype爲原型的對象
var o3 = Object.create(Object.prototype);
// 建立帶屬性x,y的對象
var o4 = Object.create(object.prototype,{
  x: {value:1, configurable:true, enumerable:true, writable:true},
  y: {value:2, configurable:true, enumerable:true, writable:true}
});

  

4.檢測對象是否擁有某屬性函數

// in運算符,檢測對象全部(包括繼承)屬性,IE只有當可枚舉屬性時才返回true
var  o = {x:1};
'x' in o;      //true
'y' in o;      //false
'toString' in o    //true

// o.hasOwnProperty(),檢測對象的全部自有屬性(無論是否可枚舉)
o.hasOwnProperty('x');     //true
o.hasOwnProperty('toString');     //false

// o.propertyIsEnumerable(),檢測對象的全部可枚舉自有屬性
o.propertyIsEnumerable('x');      //true
Object.prototype.propertyIsEnumerable('toString')    //false

  

5.枚舉對象的屬性spa

  • for/in : 可枚舉對象全部的(包括繼承)的全部可枚舉屬性
  • Object.keys() : 可枚舉對象自有屬性中的可枚舉屬性
  • Object.getOwnPropertyNames() : 可枚舉對象自有屬性中的全部屬性(包括不可枚舉的屬性,但僅E5有效,E3沒有任何辦法獲取對象的不可枚舉屬性)

 

6.屬性的特性prototype

數據屬性的4個特性:值(value)、可寫性(writable)、可枚舉性(enumerable)和可配置性(configurable)對象

存取器屬性的4個特性:讀取(get)、寫入(set)、可枚舉性(enumerable)和可配置性(configurable)blog

// 調用Object.getOwnPropertyDescriptor()能夠查看自有屬性的特性
// 返回 {value:1, writable:true, enumerable:true, configurable:true}
Object.getOwnPropertyDescriptor({x:1},'x');
// 返回undefined
Object.getOwnPropertyDescriptor({}, 'x');

設置屬性的特性用Object.defineProperty()或Object.defineProperties(),如:
var o = {};
Object.defineProperty(o,'x',{value:1, writable:true, enumerable:true, configurable:true});    //這個函數沒有返回值

var p = Object.defineProperties({}, {
    x: {value:1, writable:true, enumerable:true, configurable:true},
    y: {get: function(){}, enumerable:true, configurable:true}
});

  注:若是屬性是不可配置的,則不能夠修改屬性的可枚舉性和可配置性,可寫性只能從true改爲false。繼承

 

7.對象的三個屬性ip

查看原型屬性

// ECMAScript5
var o = {};
console.dir(Object.getPrototypeOf(o));    //Object.prototype對象

// ECMAScript3
console.dir(o.constructor.prototype);    //這個方法並不可靠,o.constructor是建立這個對象的構造函數

// 判斷一個對象是不是另外一個對象原型,這個函數的功能很是像instanceOf
var p = {x:1};
var o = Object.create(p);
p.isPrototypeOf(o);   //true
Object.prototype.isPrototypeOf(o);    //true

  

查看對象的類

function classof(o) {
    if(o === null) return "Null";
    if(o === undefined) return "Undefined";
    //使用下面這條沒法區分經過構造函數建立的對象
    //return Object.prototype.toString.call(o).slice(8,-1);
    //本人本身的想法
    return o.constructor.name;
}

  

可擴展性

// 使用Object.isExtensible()判斷對象是否可擴展
// 使用Object.preventExtensions(),將對象轉爲不可擴展,一旦轉成不可擴展的對象不能轉換回可擴展。
// 使用Object.seal()將對象轉爲不可擴展,且全部自有屬性都設置成不可配置,可經過Object.isSealed()來檢測對象是否封閉。
// 使用Object.freeze()將對象凍結,除了具有seal的功能外還把屬性設置成只讀,可經過Object.isFrozen()來檢測對象是否凍結

  

8.序列化對象

// JSON.stringify(o)將對象o轉化爲字符串
// JSON.parse(o)將對象字符串o轉化爲對象
相關文章
相關標籤/搜索