一、Object.setPrototypeOf(a,b) 与 Object.getPrototypeOf(a)
说明:Object.setPrototypeOf(a,b)是设置对象的原型,a为目标对象,b为原型对象,通常是b.prototype。
Object.getPrototypeOf(a)是获取对象的原型。a为目标对象,返回值是a的原型对象,即b.prototype。
function a(){};
function b(){};
Object.setPrototypeOf(a,b.prototype);//即设置了a的原型为b,记住这里是b.prototype而不是b;
console.log(a.__proto__===b.prototype);//true
//Object.setPrototypeOf(a,b.prototype)等同于a.__proto__=b.prototype;
b.prototype.name='jack';//在b的原型上添加name属性;
console.log(a.name)//jack
console.log(Object.getPrototypeOf(a)===b.prototype);//true
二、Object.create(a)
说明:Object.create(a)是创建对象并将参数对象的属性方法添加到目标对象上,a对象的所有属性和方法将被添加到目标对象。
var a={name:'jack'};
var b = Object.create(a);
console.log(b)//{};
console.log(b.name)//'jack',即a对象的所有属性和方法添加到b的__proto__属性上,所以可以通过b.__proto__找到name属性。
//等同于var b={};b.__proto__=a;
三、Object.defineProperty(a,b,c)与Object.defineProperties(a,b)
说明:Object.defineProperty(a,b,c)是设置对象属性以及属性描述,a是对象名称,b是属性名,c是属性描述,通常是一个对象。
Object.defineProperties(a,b)是设置对象属性集以及相关属性描述,a是对象名称,b是属性及相关描述集合。
var obj={};
Object.defineProperty(obj, "name", {
enumerable: false,//设置为false,该属性不能被枚举
configurable: false,//设置为false,该属性将不可编辑,不可删除
writable: false,//设置为false,该属性不能直接赋值修改
value: "jack"
});
console.log(obj)//{'name':'jack'}
Object.defineProperties(obj, {
"name":{
enumerable: false,
configurable: false,
writable: false,
value: "jack"
},
"age":{
enumerable: false,
configurable: false,
writable: false,
value: 28
},
});
console.log(obj)//{'name':'jack','age':28}
四、Object.getOwnPropertyNames(a) 与 Object.getOwnPropertyDescriptor(a,b)
说明:Object.getOwnPropertyNames(a)是获取自身属性的集合数组,a为目标对象;
Object.getOwnPropertyDescriptor(a,b)是获取自身属性的集合描述,a为目标对象,b为属性。
var a={name:'jack'};
var b={age:12};
a.__proto__=b;
var names=Object.getOwnPropertyNames(a);
console.log(names);//['name'];
//Object.getOwnPropertyNames(a)等同于Object.keys(a);
//注意区别
for(var i in a){
console.log(i);
};//name,age
//顺便提一下hasOwnProperty方法,该方法返回一个布尔值,判断是否是对象自身的属性,而不是继承来的属性
console.log(a.hasOwnProperty('name'));//true
console.log(a.hasOwnProperty('age'));//false
var a={name:'jack'};
var descriptor=Object.getOwnPropertyDescriptor(a,'name');
console.log(descriptor);//{value: "jack", writable: true, enumerable: true, configurable: true};
五、Object.getOwnPropertySymbols(a)
说明:Object.getOwnPropertySymbols(a)是获取对象的Symbol类型的属性,a为目标对象。
var a=Symbol('name'),b=Symbol('title');
var obj={
[a]:'jack',
[b]:'hello',
age:12
};
console.log(Object.getOwnPorpertySymbols(obj));[Symbol(name),Symbol(title)]
六、对象的存取描述符属性 set 和 get 方法
说明:set和get方法是访问器(存取描述符)属性。
var obj={},val;
Object.defineProperty(obj,name,{
configurable : true,
enumerable : true,
get: function() {
return val
},
set: function() {
val= 2;
},
});
console.log(obj.name)//undefined,取值的时候val为undefined;
obj.name = 'jack';
console.log(obj.name);//2,赋值的时候val为2;