关于构造函数Object属性和方法总结

2018-01-08  本文已影响0人  DeeamItPossible

@(JavaScript基础)

JavaScript内置对象: Object

Object对象(或Object构造函数)
属性:
-----------------------------------------------------------------------------------
Object.length:
    值为1
-----------------------------------------------------------------------------------
Object.propotype:
    表示Object的原型对象
        Object.propotype.__proto__ 表示Object的原型对象的原型对象,即null
        Object.propotype.constructor 表示Object的原型对象的构造函数,即构造函数Object
            Object.prototype属性的属性特性:
            数据描述符和存取描述符均具有以下可选键值:
                configurable:
                    当且仅当该属性的 configurable 为 true 时,该属性描述符才能够被改变,
                    可以使用delete删除属性,以及除writable特性外的其他特性可以被修改
                    默认为 false
                enumerable:
                    当且仅当该属性的enumerable为true时,该属性才能够出现在对象的枚举属性中。
                    默认为 false
            数据描述符同时具有以下可选键值:
                value:
                    该属性对应的值。默认为 undefined。
                writable:
                    当且仅当该属性的writable为true时,该属性才能被赋值运算符改变
                    默认为 false
            存取描述符同时具有以下可选键值:
                get:
                    一个给属性提供 getter 的方法,如果没有 getter 则为 undefined。
                    该方法返回值被用作属性值。默认为 undefined。
                    注意:该方法无参数
                set:
                    一个给属性提供 setter 的方法,如果没有 setter 则为 undefined。
                    该方法将接受唯一参数,并将该参数的新值分配给该属性。默认为 undefined
-----------------------------------------------------------------------------------
方法:
-----------------------------------------------------------------------------------
Object.create(proto[, propertiesObject]):
    描述:
        使用指定的原型对象和属性创建一个新对象
    参数:
        proto:
            新创建对象的原型对象
        propertiesObject:
            如果没有指定为 undefined,则是要添加到新创建对象的可枚举属性
            这些属性对应Object.defineProperties()的第二个参数
    返回值:
        在指定原型对象上添加新属性后的对象
    例子:
        const obj={name:'lee'};
        const newObj=Object.create(obj);
        console.log(obj);       // {name:'lee'}
        console.log(obj.name);  // "lee"
        const newObject=Object.create(obj,{
            age:{
                value:18
            },
            hobby:{
                value:'read'
            }
        });
        console.log(newObject); // {age: 18, hobby: "read"}
-----------------------------------------------------------------------------------
Object.defineProperty(obj, prop, descriptor)
    描述:
        给对象添加一个属性并指定该属性的配置
    参数:
        obj
        prop
        descriptor:
            描述符对象
    返回值:
        被传递给函数的对象
    例子:
        const o={
            name:'lee',
            _age:12
        };
        // 等价于
        Object.defineProperty(o,'name',{
            value:'lee',
            writable : true,
            configurable : true,
            enumerable : true
        });    {name:"lee"}
        Object.defineProperty(o,'age',{
            get:function(){
                return this._age;
            },
            set:function(value){
                console.log(value,'set')
                return value*2;
            },
            enumerable:true,
            configurable:true
        });
        console.log(o.age);  // 12
        o.age=18;            // 18 set
        console.log(o.age);  // 12
        // 注意:存取描述符的值只能通过set函数来设置
-----------------------------------------------------------------------------------
Object.defineProperties(obj, props):
    描述:
        给对象添加多个属性并分别指定它们的配置
    参数:
        obj
        props
    返回值:
        被传递给函数的对象
    例子:
        const obj={};
        Object.defineProperties(obj,{
            name:{
                value:"lee",
                writable : true,
                configurable : true,
                enumerable : true
            },
            age:{
                value:18,
                writable : true,
                configurable : true,
                enumerable : true
            }
        });   // {name: "lee", age: 18}
-----------------------------------------------------------------------------------
Object.is(value1, value2):
    描述:
        比较两个值是否相同。所有 NaN 值都相等(这与==和===不同)
        如果下列任何一项成立,则两个值相同:
            两个值都是 undefined
            两个值都是 null
            两个值都是 true 或者都是 false
            两个值是由相同个数的字符按照相同的顺序组成的字符串
            两个值指向同一个对象
            两个值都是数字并且
            都是正零 +0
            都是负零 -0
            都是 NaN
            都是除零和 NaN 外的其它同一个数字
    参数:
        value1
        value2
    返回值:
        boolean值
    例子:
        Object.is('foo', 'foo');     // true
        Object.is(window, window);   // true
        Object.is('foo', 'bar');     // false
        Object.is([], []);           // false
        // 特例
        Object.is(0, -0);            // false
        Object.is(-0, -0);           // true
        Object.is(NaN, 0/0);         // true
-----------------------------------------------------------------------------------
Object.assgin( target,...sources ):
  描述:
      用于将所有可枚举属性的值从一个或多个源对象复制到目标对象,
  参数:
      target:
          目标对象
    sources:
       源对象  
  返回值:
      返回目标对象
    例子:
        const obj={},
            source={a:1},
             arr=[2,3];
        Object.assign(obj,source,arr);  // {0: 2, 1: 3, a: 1}
    总结:
        该方法常用来将一个多个对象的键值对复制到空对象中去
-----------------------------------------------------------------------------------     
Object.preventExtensions(obj):
    描述:
        防止对象的任何扩展
    参数:
        obj:
            将要变得不可扩展的对象
    返回值:
        已经不可扩展的对象
    例子:
        const obj={};
        const newObj=Object.create(obj);
        newObj.name='lee';
        newObj.age=18;
        Object.preventExtensions(newObj);
        Object.getOwnPropertyDescriptors(newObj);
        // {
        //  age:{
        //      value: 18, 
        //      writable: true, 
        //      enumerable: true, 
        //      configurable: true   // 调用preventExtensions方法后的对象属性仍然可以配置
        //  },
        //  name:{
        //      value: "lee", 
        //      writable: true, 
        //      enumerable: true,
        //       configurable: true
        //     }
        // }
        newObj.hobby='read';
        console.log(newObj);  // {name: "lee", age: 18}
        delete newObj.name;
        console.log(newObj);  // {age: 18}
        obj.name='panda';
        console.log(newObj.name);  // 'lee'
-----------------------------------------------------------------------------------
Object.seal(obj):
    描述:
        可以让一个对象密封,并返回被密封后的对象。
        密封对象将会阻止向对象添加新的属性,并且会将所有已有属性的可配置性(configurable)置为不可配置(false),即不可修改属性的描述或删除属性。
        但是可写性描述(writable)为可写(true)的属性的值仍然可以被修改
    参数:
        obj
    返回值:
        将要被密封的对象
    例子:
        const obj={};
        const newObj=Object.create(obj);
        newObj.name='lee';
        newObj.age=18;
        Object.seal(newObj);
        Object.getOwnPropertyDescriptors(newObj);
        // {
        //  age:{
        //      value: 18, 
        //      writable: true, 
        //      enumerable: true, 
        //      configurable: false   // 调用seal方法后的对象属性仍然不可配置
        //  },
        //  name:{
        //      value: "lee", 
        //      writable: true, 
        //      enumerable: true,
        //       configurable: false
        //  }
        // }
        newObj.hobby='read';
        console.log(newObj);  // {name: "lee", age: 18}
        delete newObj.name;
        console.log(newObj);  // {name: "lee", age: 18}
        newObj.name='panda';
        console.log(newObj.name);  // 'panda'
-----------------------------------------------------------------------------------
Object.freeze(obj):
    描述:
        冻结对象:其他代码不能删除或更改任何属性,
        如果一个属性的值是个对象,则这个对象中的属性是可以修改的,除非它也是个冻结对象
    参数:
        obj
    返回值:
        被冻结的对象
    例子:
        const obj={};
        const newObj=Object.create(obj);
        newObj.name='lee';
        newObj.age=18;
        Object.freeze(newObj);
        Object.getOwnPropertyDescriptors(newObj);
        // {
        //  age:{
        //      value: 18, 
        //      writable: false,    // 调用freeze方法后的对象属性不可更改
        //      enumerable: true, 
        //      configurable: true   // 调用freeze方法后的对象属性不可配置
        //  },
        //  name:{
        //      value: "lee", 
        //      writable: false, 
        //      enumerable: true,
        //       configurable: true
        //  }
        // }
        newObj.hobby='read';
        console.log(newObj);  // {name: "lee", age: 18}
        delete newObj.name;
        newObj.name='panda';
        console.log(newObj);  // {name: "lee", age: 18}
        newObj.name='panda';
        console.log(newObj.name);  // 'lee'


        //  深冻结
        function deepFreeze(obj){
            var propNames = Object.getOwnPropertyNames(obj);
            propNames.forEach(function(name) {
                var prop = obj[name];
            if (typeof prop == 'object' && prop !== null)
              deepFreeze(prop);
            });
           return Object.freeze(obj);
        };
        const o={person:{name:'lee'}};
        deepFreeze(o);o.person.name='zz';
        console.log(o.person.name);  // 'lee'
-----------------------------------------------------------------------------------
Object.isExtensible(obj):
    描述:
        判断对象是否可扩展,是否可以在它上面添加新的属性
        默认情况下,对象是可扩展的:即可以为他们添加新的属性。
        以及它们的 __proto__  属性可以被更改。
        Object.preventExtensions,Object.seal 或 Object.freeze 方法都可以标记一个对象为不可扩展
    参数:
        obj
    返回值:
        boolean值
    例子:
        const obj={};
        Object.isExtensible(obj); // true

        // ...可以变的不可扩展.
        Object.preventExtensions(obj);
        Object.isExtensible(obj); //  false
        
        // 密封对象是不可扩展的.
        Object.seal(obj);
        Object.isExtensible(obj); // false
        
        // 冻结对象也是不可扩展.
        Object.freeze(obj);
        Object.isExtensible(obj); // false
-----------------------------------------------------------------------------------
Object.isSealed(obj):
    描述:
        如果这个对象是密封的,则返回 true,否则返回 false
        密封对象是指那些不可 扩展 的,且所有自身属性都不可配置且因此不可删除(但不一定是不可写)的对象
    参数:
        obj
    返回值:
        boolean
    例子:
        const obj={name:'lee'};
        Object.preventExtensions(obj);
        obj.age=18;
        console.log(obj)    
-----------------------------------------------------------------------------------
Object.isFrozen(obj):
    描述:
        判断对象是否已经冻结
        一个对象是冻结的是指它不可扩展,所有属性都是不可配置的,
        且所有数据属性(即没有getter或setter组件的访问器的属性)都是不可写的
    参数:
        obj
    返回值:
        boolean
    例子:
        const obj={};
        Object.isSealed(obj); // false

        // ...可以变的不可扩展.
        Object.preventExtensions(obj);
        Object.isSealed(obj); //  true
        
        // 密封对象是不可扩展的.
        Object.seal(obj);
        Object.isSealed(obj); // true
        
        // 冻结对象也是不可扩展.
        Object.freeze(obj);
        Object.isSealed(obj); // true
-----------------------------------------------------------------------------------
获取对象属性描述符对象
Object.getOwnPropertyDescriptor
Object.getOwnPropertyDescriptor(obj, prop):
    描述:
        返回对象指定的属性配置
    参数:
        obj
        prop
    返回值:
        如果指定的属性存在于对象上,则返回其属性描述符对象(property descriptor),
        否则返回 undefined
    例子:
        
-----------------------------------------------------------------------------------
Object.getOwnPropertyDescriptors
Object.getOwnPropertyDescriptors(obj):
    描述:
        返回对象指定的属性配置
    参数:
        obj
    返回值:
        所指定对象的所有自身属性的描述符,如果没有任何自身属性,则返回空对象
    例子:
        const obj={};
        const newObj=Object.create(obj);
        newObj.name='lee';
        newObj.age=18;
        Object.getOwnPropertyDescriptors(newObj);
        // {
        //  age:{
        //      value: 18, 
        //      writable: true,    
        //      enumerable: true, 
        //      configurable: true   
        //  },
        //  name:{
        //      value: "lee", 
        //      writable: true, 
        //      enumerable: true,
        //       configurable: true
        //  }
        // }
冻结或密封或阻止对象扩展详解:
总结:
    不可扩展:
        阻止添加自身的属性,但属性仍然可以添加到对象原型
        不可扩展对象的属性仍然可被删除
    密封对象:
        是指那些不可 扩展 的,且所有自身属性都不可配置且因此不可删除(但不一定是不可写,可写性描述(writable)为可写(true)的属性的值仍然可以被修改)的对象
    冻结对象:
        冻结指的是不能向这个对象添加新的属性,不能修改其已有属性的值,不能删除已有属性,以及不能修改该对象已有属性的可配置性、可写性。(可枚举性是可以修改的,官网有误)
        也就是说,这个对象永远是不可变的
    
枚举方法:
    从 ECMAScript 5 开始,有三种原生的方法用于列出或枚举对象的属性:
    
    for...in 循环
    该方法依次访问一个对象及其原型链中所有可枚举的属性。(原型链+可枚举)
    Object.keys(o)
    该方法返回一个对象 o 自身包含(不包括原型中)的所有属性的名称的数组。(可枚举)
    Object.getOwnPropertyNames(o)
    该方法返回一个数组,它包含了对象 o 所有拥有的属性(无论是否可枚举)的名称。(所有属性,不论是否枚举)
    Object.getOwnPropertySymbols(obj):
    该方法返回一个数组,它包含了指定对象自身所有的符号属性。(符号属性)
    
    Object.entries(obj):
    该方法返回给定对象自身可枚举属性的[key, value]数组

    例子:
    const o={
            sex:'boy',
            weight:'60kg'
        };
        let age=Symbol('age');
        const newObj=Object.create(o)
        Object.defineProperties(newObj,{
            'name':{
                value:'lee',
                writable:true,
                enumerable:true,
                configurable:true,
            },
            'hobby':{
                value:'read',
                writable:true,
                enumerable:true,
                configurable:true,
            },
            [age]:{
                value:18,
                writable:true,
                enumerable:false,
                configurable:true,
            },
            'friend':{
                value:'Jack',
                writable:true,
                enumerable:false,
                configurable:true,
            },
        });
        const arr=[];
        for(let v in newObj){
            arr.push(v)
        };
        console.log(arr);       //  ["name", "hobby", "sex", "weight"]
        const arr2=Object.keys(newObj);
        console.log(arr2);      //  ["name", "hobby"]
        const arr3=Object.getOwnPropertyNames(newObj);
        console.log(arr3);      //  ["name", "hobby", "friend"]
        const arr4=Object.getOwnPropertySymbols(newObj);        
        console.log(arr4);      //  [Symbol(age)]
        const arr5=Object.entries(newObj);
        console.log(arr5);      //   [["name", "lee"],["hobby", "read"]]
-----------------------------------------------------------------------------------
Object.keys(obj):
    描述:
        返回一个由一个给定对象的自身可枚举属性组成的数组,
        数组中属性名的排列顺序和使用 for...in 循环遍历该对象时返回的顺序一致 
        (两者的主要区别是 一个 for-in 循环还会枚举其原型链上的属性)
    参数:
        obj
    返回值:
        一个表示给定对象的所有可枚举属性的字符串数组
    例子:
        const obj={name:'lee'};
        const newObj=Object.create(obj);
        newObj.age=18;
        console.log(Object.keys(newObj));  // ['name']
        const arr=[];
        for(let v in newObj){
            arr.push(v);
        }
        console.log(arr);  // ['name','age']
-----------------------------------------------------------------------------------
Object.getOwnPropertyNames(obj):
    描述:
        返回一个数组,它包含了指定对象所有的可枚举或不可枚举的属性名
    参数:
        obj
    返回值:
        在给定对象上找到的属性对应的字符串数组
    例子:
        const arr=['a','b','c','d'];
        Object.getOwnPropertyNames(arr);  // ["0", "1", "2", "3", "length"]
        const arr={0:'a',1:'b',2:'c'};
        console.log(Object.getOwnPropertyNames(arr));  // ["0", "1", "2"]
        const obj={name:'lee',age:18};
        console.log(Object.getOwnPropertyNames(obj));  //  ["name", "age"]
-----------------------------------------------------------------------------------
Object.getOwnPropertySymbols(obj):
    描述:
        返回一个数组,它包含了指定对象自身所有的符号属性
    参数:
        obj
    返回值:
        在给定对象自身上找到的所有 Symbol 属性的数组
    例子:
         const obj={};
        let a=Symbol('a');
        let b=Symbol('b');
        obj[a]='name';
        obj[b]='age';
        obj.hobby='read';
        Object.getOwnPropertySymbols(obj);  //  [Symbol(a), Symbol(b)]
-----------------------------------------------------------------------------------
Object.values(obj):
    描述:
        返回给定对象自身可枚举值的数组
    参数:
        obj
    返回值:
        Object.values()返回一个数组,其元素是在对象上找到的枚举属性值
    例子:
        const obj={name:'lee',age:18};
        Object.values(obj);   // ["lee", 18]
-----------------------------------------------------------------------------------
Object.entries(obj):
    描述:
        返回给定对象自身可枚举属性的[key, value]数组
    参数:
        obj
    返回值:
        给定对象自身可枚举属性的键值对数组
    例子:
        const obj={name:"lee",age:18};
        Object.entries(obj));  //[['name','lee'],['age',18]]
获取或设置对象的原型对象
-----------------------------------------------------------------------------------
Object.getPrototypeOf(obj):
    描述:
        返回指定对象的原型对象
    参数:
        obj
    返回值:
        给定对象的原型。如果没有继承属性,则返回 null
    例子:
        const proto=null;
        const obj=Object.create(proto);   // {}
        Object.getPrototypeOf(obj)==null;    // true
-----------------------------------------------------------------------------------
Object.setPrototypeOf(obj, prototype):
    描述:
        设置一个指定的对象的原型 ( 即, 内部[[Prototype]]属性)到另一个对象或  null
    参数:
        obj:
            要设置其原型的对象
        prototype:
            该对象的新原型(一个对象 或 null)
    返回值:
        要设置其原型的对象
    例子:
        const obj={};
        const proto={name:'lee',age:18};
        Object.setPrototypeOf(obj,proto);
        console.log(obj.__proto__);  // {name: "lee", age: 18}
-----------------------------------------------------------------------------------
Object.prototype
属性:
-----------------------------------------------------------------------------------
Object.prototype.constructor
    特定的函数,用于创建一个对象的原型
-----------------------------------------------------------------------------------
Object.prototype.__proto__ 
    指向当对象被实例化的时候,用作原型的对象
-----------------------------------------------------------------------------------
方法:
-----------------------------------------------------------------------------------
Object.prototype.hasOwnProperty(prop):
    描述:
        返回一个布尔值 ,表示某个对象是否含有指定的属性,而且此属性非原型链继承的。
    参数:
        prop
    返回值:
        boolean值
-----------------------------------------------------------------------------------
Object.prototype.isPrototypeOf(obj)
    描述:
        返回一个布尔值,表示指定的对象是否在本对象的原型链中
    参数:
        obj
    返回值:
        boolean值
-----------------------------------------------------------------------------------

Object.prototype.propertyIsEnumerable()
判断指定属性是否可枚举,内部属性设置参见 ECMAScript [[Enumerable]] attribute 。
Object.prototype.toLocaleString()
直接调用 toString()方法。
Object.prototype.toString()
返回对象的字符串表示。
Object.prototype.valueOf()
-----------------------------------------------------------------------------------
上一篇下一篇

猜你喜欢

热点阅读