面向对象
对象
key先数值,如果是字符串 按照谁先设置就先遍历谁
var arr = [1, 3, 5, 2, 3, 4, 5, 6, 3, 4];
arr = Object.values(arr.reduce((v, t) => {
//加字符串a是为了不自动排序
v["a"+t] = t;
return v
}, {}))
console.log(arr)
var obj={a:1};
console.log(obj.toString())
//构造方法
console.log(obj.constructor)
//对象原型 Prototype 原型
console.log(obj.__proto__)
var arr1=new Array();
//任何实例化对象都有自身原型链
var arr=[1,2,3,4,5];
//数组原型是数组得方法---下来是对象,数组是由对象扩展的
console.log(arr.__proto__.__proto__)
var o={a:1};
//以o对象为原型,创建出一个新的对象
var o1=Object.create(o);
o1.b=10;
console.log(o1);
var o={a:1};
var o1=Object.create(o);
o1.b=10;
o1.a=20;
// 禁止使用
o1.__proto__.a=20;
console.log(o1);
// 在这里a是o1的原型属性,b是o1的对象属性(实例化属性)
// 给对象设置属性都是设置的对象属性,而不是原型属性
// 获取属性时,查找离自己最近的这个属性值,如果自身不存在,则在原型链中查找距离自己最近原型属性
// 当需要隐式转换为字符串时调用toString方法
o.toString=function(){
return JSON.stringify(this);
}
// 当需要隐式转换为数值时,需要调用valueOf方法
o.valueOf=function(){
return this.a;
}
对象的方法
根据某个对象作为原型创建出一个新对象
Object.create()
复制对象,将source复制到target对象上,返回target,source可以是多个
Object.assign(target,source...)
//举例
var o={a:1};
var o1={b:2};
var o2={c:3};
var o3={d:4};
// 浅复制,不会改变o3的引用关系
Object.assign(o3,o,o1,o2)
console.log(o3)
// 转换后形成的新对象
o3=JSON.parse(JSON.stringify(o));
var o3={...o};
console.log(o3)
Object.defineProperty(要设置的对象,要添加或者设置的对象属性名,设置这个属性的描述对象)
Object.defineProperty(o,"a",{
enumerable:true,//是否可枚举
configurable:true,//是否可以删除或者是否可以修改描述对象
writable:true,//是否可写,可修改
value:3,//属性的值或者方法函数
});
//如果没有设置默认都是false
获取对象的属性名所组成的数组,与Object.keys相似,不可以获取Sybmol属性
// Object.getOwnPropertyNames()
可以获取到不可枚举属性,Object.keys不可以获取不可枚举属性
// Object.getOwnPropertySymbols();
获取对象的所有属性名
var keys=Reflect.ownKeys(o);
// 冻结对象 不能修改属性,不能删除属性,不能添加属性(不可扩展)
Object.freeze(o);
// 对象是否冻结
console.log(Object.isFrozen(o))
//可以修改属性值,不能删除属性,不能添加属性
Object.seal(obj);
//判断是否被seal
console.log(Object.isSealed(o));
禁止扩展 可以修改对象属性值,可以删除对象属性值,但是不能扩展
Object.preventExtensions(obj);
是否被禁止扩展
console.log(Object.isExtensible(obj));
var obj={a:1,b:2};
Object.defineProperty(obj,"c",{
enumerable:true,
value:10
});
获取对象属性的描述对象
console.log(Object.getOwnPropertyDescriptor(obj,"c"))
获取对象的原型
Object.getPrototypeOf(o) obj.__proto__
设置某个对象作为另一个对象的原型, o.__proto__=o1
Object.setPrototypeOf(o,o1);
//案例
var o={a:1};
var o1={b:2};
Object.setPrototypeOf(o,o1);
console.log(o)
与===相同,但是可以比较NaN是相同
console.log(Object.is(1,1))