1. 程式人生 > >對象(一)——創建對象及操作

對象(一)——創建對象及操作

dao 運算 config des abc prot .config 如果 tps

創建對象

1.字面量
var obj = {x:1,y:2};
var obj2 = {
    x:1,
    y:2,
    o:{
        z:3,
        n:4
    }
};
2.new
function foo(){}
foo.prototype.z = 3;
var obj = new foo();
obj.y = 2;
obj.x = 1;

obj.x; //1
obj.y; //2
obj.z; //3
type of obj.toString; // ‘function‘
‘z‘ in obj; //true,z從foo.prototype繼承而來
obj.hasOwnProperty(‘z‘); //false,obj這個對象本身沒有z屬性 

技術分享圖片

function foo(){}
foo.prototype.z = 3;
var obj = new foo();
obj.y = 2;
obj.x = 1;
obj.z = 5;

obj.hasOwnProperty(‘z‘);//true
foo.prototype.z; //still 3
obj.z;  //5

obj.z = undefined;
obj.z;  //undefined
//此時如果要訪問原型z,需要刪除obj的z屬性
delete obj.z; //true
obj.z; //3

delete obj.z; //再次刪除,不會刪除原型鏈
obj.z; //still 3!!!
3.create

創建一個對象,對象的原型指向裏面的參數

var obj = Object.create({x:1});
obj.x; //1
typeof obj.toString //‘function‘
obj.hasOwnProperty(‘x‘);//false

var obj = Object.create(null);
obj.toString //undefined

屬性操作

讀寫
var yz;
if(obj.y){ //檢測屬性
    yz = obj.y.z
}
//利用運算符達到同樣效果
var yz = obj && obj.y && obj.y.z
刪除
var person = {age:20, title:‘fe‘};
delete person.age; //true
delete person[‘title‘];//true
person.age;//undefined
//再次刪除不存在的屬性
delete person.age; //true,還是會返回true

delete Object.prototype;//false
//因為Object.prototype被配置為不可修改;
var descriptor = Object.getOwnPropertyDescriptor(Object,‘prototype‘);
descriptor.configurable;//false
檢測
var cat = new Object;
cat.legs = 4;
cat.name = ‘Kitty‘;

‘legs‘ in cat;//true
‘abc‘ in cat;//false
‘toString‘ in cat;//true,運算符in會向上查找,toString繼承於Object.property
//檢測屬性是否為自身擁有
cat.hasOwnProperty(‘legs‘);//true
cat.hasOwnProperty(‘toString‘);//false
//檢測屬性是否可枚舉
cat.propertyIsEnumberable(‘legs‘);//true
cat.propertyIsEnumberable(‘toSgring‘);//false
自定義屬性
Object.defineProperty(cat,‘price‘,{enumerable:false,value:1000});
cat.propertyIsEnumberable(‘price‘);//false
cat.hasOwnProperty(‘price‘);//true

補充:屬性一旦設置configurable:false,將不可再變回可配置

遍歷屬性
//如果不想遍歷原型鏈的屬性
for(key in obj){
    if(obj.hasOwnProperty(key)){
    //do something
    }
}
Object.defineProperty(obj, prop, descriptor)

該方法多數默認值為false,而我們常用的定義方式多為可枚舉,刪除,賦值等

參數
obj
  要在其上定義屬性的對象。
prop
  要定義或修改的屬性的名稱。
descriptor
  將被定義或修改的屬性描述符。
  
---

該方法允許精確添加或修改對象的屬性。通過賦值來添加的普通屬性會創建在屬性枚舉期間顯示的屬性(for...in 或 Object.keys 方法), 這些值可以被改變,也可以被刪除。這種方法允許這些額外的細節從默認值改變。默認情況下,使用Object.defineProperty()添加的屬性值是不可變的。


數據描述符和存取描述符均具有以下可選鍵值:

數據描述符

  • configurable
    當且僅當該屬性的 configurable 為 true 時,該屬性描述符才能夠被改變,同時該屬性也能從對應的對象上被刪除。默認為 false。
  • enumerable
    當且僅當該屬性的enumerable為true時,該屬性才能夠出現在對象的枚舉屬性中。默認為 false。
  • value
    該屬性對應的值。可以是任何有效的 JavaScript 值(數值,對象,函數等)。默認為 undefined。
  • writable
    當且僅當該屬性的writable為true時,value才能被賦值運算符改變。默認為 false

存取描述符

  • get
    一個給屬性提供 getter 的方法,如果沒有 getter 則為 undefined。該方法返回值被用作屬性值。默認為 undefined。
  • set
    一個給屬性提供 setter 的方法,如果沒有 setter 則為 undefined。該方法將接受唯一參數,並將該參數的新值分配給該屬性。默認為 undefined。

對象(一)——創建對象及操作