對象(一)——創建對象及操作
阿新 • • 發佈:2018-07-28
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。
對象(一)——創建對象及操作