面向对象(object-oriented)

面向对象

对象

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))
————————

object-oriented

对象

The key value is set first. If it is a string, it will be traversed first according to who sets it first

 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;
}

< strong > object method < / strong >

根据某个对象作为原型创建出一个新对象
   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))