该方法用于创建一个新对象,新建对象具有指定原型和若干个指定属性;
Object.create(proto)
Object.create(proto, propertiesObject)
该方法接收两个参数,第一个参数是新建对象的指定原型对象,第二个参数可选,表示新建对象的某些属性;第二个参数要传入一个对象,对象内容是键值对,配置有四个参数,分别表示如下:
var obj1 = {
name: '小明',
age: 13,
intro: function() {
console.log(`my name is ${this.name}`);
}
}
obj1.intro(); // my name is 小明
var obj2 = Object.create(obj1, {
'EnglishName': {value: 'xiaoMing', writable: false, configurable: false, enumerable: true },
'hobby': {value: 'playing', writable: true, configurable: false, enumerable: false }
})
obj2.intro() // my name is 小明
console.log(obj2.EnglishName); // xiaoMing
obj2.EnglishName = 'xiaoHong'
console.log(obj2.EnglishName); // xiaoMing,未被重写
for(var item in obj2) {
console.log(item); // EnglishName name age intro hooby并未被遍历出来
}
console.log(delete obj2.age); // true
console.log(delete obj2.hobby); // false 删不掉hobby属性
补充:
该方法可以对对象已有的属性进行修改,或增加新的属性
Object.defineProperty(obj, prop, descriptor)
该方法接收三个参数,分别是要定义属性的对象 / 要定义的属性名称 / 属性描述对象(该对象依然是传入上述四种配置)
var obj1 = {
name: '小明',
age: 13,
intro: function() {
console.log(`my name is ${this.name}`);
}
}
Object.defineProperty(obj1, 'name', {
value: '小红',
configurable: false
})
console.log(obj1); // {name: '小红', age: 13, intro: ƒ}
console.log(delete obj1.name); // false
该方法与上面那个方法使用方式相似,只不过可以对多个属性进行修改或新增;
Object.defineProperties(obj, props)
该方法传入两个参数,其中第一个参数依然是要定义或修改属性的对象;第二个参数定义属性描述符对象(上述四个参数),分别以对象的形式传入,属性做键名~
var obj1 = {
name: '小明',
age: 13,
intro: function() {
console.log(`my name is ${this.name}`);
}
}
Object.defineProperties(obj1, {
'name': {
value: '小红',
writable: false
},
'englishName': {
value: 'Red',
enumerable: false
}
})
console.log(obj1); // {name: '小红', age: 13, englishName: 'Red', intro: ƒ}
该方法用于获取对象中某个自有属性(非继承得来)的属性描述对象;
Object.getOwnPropertyDescriptor(obj, prop)
该方法传入两个参数,第一个参数是要查找的目标对象,第二个参数是目标对象内自有属性名称;
var obj1 = {
name: '小明',
age: 13,
intro: function() {
console.log(`my name is ${this.name}`);
}
}
var namepro = Object.getOwnPropertyDescriptor(obj1, 'name');
console.log(namepro); // { configurable: true enumerable: true value: "小明" writable: true }
该方法用于获取某对象上所有自身属性(非继承)的属性描述对象,
Object.getOwnPropertyDescriptors(obj)
只有一个参数,表示要查找的目标对象,如果没有任何自身属性,则返回一个空对象;
var obj1 = {
name: '小明',
age: 13,
intro: function() {
console.log(`my name is ${this.name}`);
}
}
var pro = Object.getOwnPropertyDescriptors(obj1);
console.log(pro);
该方法获取对象上所有的自由属性(不包含继承得来的属性和Symbol属性);
Object.getOwnPropertyNames(obj)
传入一个目标对象作为参数;返回一个字符串数组;
var obj1 = {
name: '小明',
age: 13,
intro: function() {
console.log(`my name is ${this.name}`);
}
}
var obj2 = Object.create(obj1, {
'EnglishName': {
value: 'xiaoMing',
enumerable: false
},
'class': {
value: '四年级',
configurable: false
}
});
console.log(Object.getOwnPropertyNames(obj2)); // ['EnglishName', 'class'] 继承属性name,age,intro并未获取到
该方法用于获取某对象中所有 Symbol 属性,返回一个数组;
Object.getOwnPropertySymbols(obj)
var obj = {};
var a = Symbol("a");
obj[a] = "localSymbol";
obj.name = '小明'
console.log(Object.getOwnPropertySymbols(obj)); // [Symbol(a)]
该方法用于为某对象设置一个指定的原型对象,即Prototype
Object.setPrototypeOf(obj, prototype)
传入两个参数,第一个参数是要设置的对象,第二个参数表示要指定的新原型(Prototype)
如果第一个参数不是一个对象,则该方法啥也不做;
var obj1 = {
name: '小明',
age: 13,
intro: function() {
console.log(`my name is ${this.name}`);
}
}
var obj2 = {}
Object.setPrototypeOf(obj2, obj1)
console.log(obj2.name); // 小明
obj2.intro() // my name is 小明
该方法返回指定对象的对象原型prototype
Object.getPrototypeOf(obj)
只传入一个参数,即目标对象,若该目标对象没有继承属性,则返回null
function Obj() {
}
let obj = new Obj()
console.log(Object.getPrototypeOf(obj) === Obj.prototype) // true
const prototype1 = {};
const object1 = Object.create(prototype1);
console.log(Object.getPrototypeOf(object1) === prototype1); // true
该方法用于将源对象(sources)的所有可枚举的自有属性(不是通过继承得来的属性)复制到目标对象(target)上;
返回合并后的对象target;
Object.assign(target, ...sources)
若源对象与目标对象具有相同的key,则目标对象中的属性将会被源对象中的属性覆盖;
该方法属于浅拷贝;
该方法用于比较两个值是否严格相等,与严格相等运算符===的行为基本一致,返回布尔值;但是在处理NaN和-0/+0o有差异
Object.is(value1, value2); // value1和value2是要比较的两个值
console.log(Object.is(1, 1)) // true
console.log(Object.is(NaN, NaN)) // true
console.log(Object.is(+0, -0)) // false
console.log(1 === 1) // true
console.log(NaN === NaN) // false
console.log(+0 === -0) // true
console.log(Object.is([], [])); // false
console.log([] === []); // false
该方法返回自身(不含继承)的所有可枚举(enumerable)属性的键名
Object.keys(obj) // obj要遍历的对象
该方法返回一个由键名组成的数组
var obj1 = {
name: '小明',
age: 13,
sing: function() {
console.log('he can sing ~');
}
}
console.log(Object.keys(obj1)); // ['name', 'age', 'sing']
该方法返回自身(不含继承)的所有可枚举(enumerable)属性的键值;
Object.values(obj) // obj为要遍历的对象
该方法返回由键值组成的数组
var obj1 = {
name: '小明',
age: 13,
sing: function() {
console.log('he can sing ~');
}
}
console.log(Object.values(obj1)); // ['小明', 13, ƒ]
该方法返回自身(不含继承)的所有可枚举(enumerable)属性的键值对;
Object.entries(obj) // obj
该方法返回由键值对组成的数组;
var obj1 = {
name: '小明',
age: 13,
sing: function() {
console.log('he can sing ~');
}
}
console.log(Object.entries(obj1)); // [ ['name', '小明'], ['age', 13], ['sing', ƒ] ]
该方法用于判断对象obj自身属性中是否具有指定的属性,返回布尔值
obj.hasOwnProperty(prop)
所传参数为某属性
var obj1 = {
name: '小明',
age: 13,
intro: function() {
console.log(`my name is ${this.name}`);
}
}
var obj2 = {}
Object.setPrototypeOf(obj2, obj1)
console.log(obj1.hasOwnProperty('name')); // true
console.log(obj2.hasOwnProperty('name')); // false
该方法用于测试一个对象是否存在于另一个对象的原型链上,返回布尔值
prototypeObj.isPrototypeOf(object)
其中object是要测试的目标对象,prototypeObj是另一个对象的原型链;
var o = {};
function Person(){
};
var p1 = new Person(); //继承自Person原来的原型Person.prototype
Person.prototype = o;
var p2 = new Person(); //继承自o
console.log(o.isPrototypeOf(p1)); // false o是不是p1的原型
console.log(o.isPrototypeof(p2)); // true o是不是p2的原型
console.log(Object.prototype.isPrototypeOf(p1)); // true
console.log(Object.prototype.isPrototypeOf(p2)); // true
// p1的原型链结构是p1 => 原来的Person.prototype => Object.prototype => `null``
// p2的原型链结构是p2 => o => Object.prototype => null
// p1和p2都拥有Object.prototype, 他们都在Object.Prototype的原型链上