美文网首页
关于构造函数Object属性和方法总结

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

作者: DeeamItPossible | 来源:发表于2018-01-08 21:42 被阅读0次

    @(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()
    -----------------------------------------------------------------------------------
    

    相关文章

      网友评论

          本文标题:关于构造函数Object属性和方法总结

          本文链接:https://www.haomeiwen.com/subject/yejinxtx.html