JS 对象(对象遍历,拷贝)
定义属性
- 直接 obj.对象 的方法
- Object.defineProperty(obj, prop, descriptor) ,这种方法可以设置 或者修改对象属性的访问权限
数据描述符和存取描述符均具有以下可选键值:
configurabl
当且仅当该属性的 configurable 为 true 时,该属性描述符才能够被改变,同时该属性也能从对应的对象上被删除。默认为 false
enumerable
当且仅当该属性的enumerable为true时,该属性才能够出现在对象的枚举属性中。默认为 false
数据描述符同时具有以下可选键值:
value
该属性对应的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。默认为 undefined
writable
当且仅当该属性的writable为true时,value才能被赋值运算符改变。默认为 false
对象合并
Object.assign(target,source1,source2)
Return 返回合并后的新对象
注意
如果合并的对象中有相同的属性,那么后面的会覆盖前面的
var obj = { name : '小白', color : 'white' } var obj1 = { say : function(){ console.log('汪汪'); } } var obj2 = { name : '小黑' } var newObj = Object.assign(obj,obj1,obj2) console.log(newObj.name); //输出 小黑 newObj.say();
判断属性是否存在
Object.hasOwnProperty()
存在 返回true 不存在 返回false
获得对象属性
Object.keys 返回一个数组中包含所有属性名
Object.values 返回一个数组中包含所有属性值
遍历属性
- for...in... 最常见的一种方式,可以遍历对象当前所有可见属性,包括原型中定义的属性
- Object.keys 获得对象所有可见属性的属性名,不包括原型中定义属性
- Object.getOwnPropertyNames 获得对象所有属性,不包括原型中定义属性
function Dog(name,color){
this.name = name;
this.color = color;
}
Dog.prototype = {
foods : ['bones','meat'],
say : function(){
console.log('汪汪');
},
eat : function(){
console.log('i am '+this.nam+' i eat '+this.foods.join(','));
}
}
var xiaohei = new Dog('小黑','black');
Object.defineProperty(xiaohei,'name',{enumerable:false});
console.log(Object.keys(xiaohei));
//输出 ["color"]
console.log(Object.getOwnPropertyNames(xiaohei));
//输出 (2) ["name", "color"]
对象拷贝
浅拷贝 : 即拷贝当前对象地址给一个新的对象,任何对象改变会引起其他对象改变
var xiaohei = new Dog('小黑','black');
var xiaoheihei = xiaohei ; //对象浅拷贝
xiaoheihei.name = '小黑黑'
console.log(xiaohei.name);
//输出 小黑黑
深拷贝 : 即将对象所有属性和方法拷贝一份给一个新的对象
var xiaohei = new Dog('小黑','black');
var xiaobai = {};
for(let key in xiaohei){
xiaobai[key] = xiaohei[key]
}
xiaobai.name = "小白"
console.log(xiaohei.name);
//输出 小黑
数组拷贝
数组与对象类似,都属于引用型变量,因此直接使用 = 只是拷贝地址,如需要拷贝数组,可以使用 slice 方法
var arr = [1,2,3,4] ;
arr1 = arr ; //浅拷贝
arr2 = arr.slice(0); //深拷贝
arr[0] = 'hello' ;
console.log(arr1); //'hello',2,3,4
console.log(arr2); //1,2,3,4