ECMAScript5 Object新属性方法

来源:互联网 发布:下载办公软件wpsoffice 编辑:程序博客网 时间:2024/05/28 22:12

/###1. Obeject.create(prototype[, descriptors])
这个方法用于创建一个对象, 并把其prototype属性赋值为第一个参数,同时可以设置多个descriptors, 这个方法可以用来实现对象的继承.

var obj = Object.create(obj1); //创建一个对象obj,obj的原型是obj1// 此方法的兼容性处理function myCreate(obj){    if(Object.create){        return Object.create(obj);    }else{        function F(){}        F.prototype = obj;        return new F();    }}

2. Object.defineProperties(Obj, descriptors)与Object.defineProperty(Obj, prop, descriptor)

这2个方法直接在一个对象上定义新的属性或修改现有属性,并返回该对象。
props
要定义其可枚举属性或修改的属性描述符的对象。对象中存在的属性描述符主要有两种:数据描述符和访问器描述符。描述符具有以下键:

configurable
true 当且仅当该属性描述符的类型可以被改变并且该属性可以从对应对象中删除。
默认为 false

enumerable
true 当且仅当在枚举相应对象上的属性时该属性显现。
默认为 false

value
与属性关联的值。可以是任何有效的JavaScript值(数字,对象,函数等)。
默认为 undefined.

writable
true当且仅当与该属性相关联的值可以用assignment operator改变时。
默认为 false

get
作为该属性的 getter 函数,如果没有 getter 则为undefined。函数返回值将被用作属性的值。
默认为 undefined

set
作为属性的 setter 函数,如果没有 setter 则为undefined。函数将仅接受参数赋值给该属性的新值。
默认为 undefined

例如:

Object.defineProperty(o,'age', {    value: 24,    writable: true,    enumerable: true,    configurable: true})Object.defineProperty(o, 'sex', {    value: 'male',    writable: false,    enumerable: false,    configurable: false})console.log(o.age) //24o.age = 25for (var obj in o) {    console.log(obj + ' : ' + o[obj]);    /*    age : 25  //没有把sex : male 遍历出来    say : function () {        alert(this.name);    }     name : Byron     */}delete o.age;console.log(o.age)//undefined console.log(o.sex) //male//o.sex = 'female' //Cannot assign to read only property 'sex' of #<Object> delete o.age; console.log(o.sex) //male ,并没有被删除

3. Object.getOwnPropertyDescriptor(O, property)

此方法用于获取对象的值.

    var obj = {        name: 'o',        age: 24    }    Object.defineProperty(obj, 'a', {        value: '12',        writable: true,        enumerable: true    })    var aaa = Object.getOwnPropertyDescriptor(obj, 'age')    console.log(aaa)// {value: 24, writable: true, enumerable: true, configurable: true}

4. Object.getOwnPropertyNames(obj)

获取所有的属性名,不包括prototy中的属性,返回一个数组

    var obj = {        name: 'o',        age: 24    }    Object.defineProperty(obj, 'a', {        value: '12',        writable: true,        enumerable: true    })    console.log(Object.getOwnPropertyNames(obj)) // ["name", "age", "a"]

5. Object.keys(obj) / Object.keys(obj) / Object.entries(obj)

Object.keys(obj)和getOwnPropertyNames方法类似,但是获取所有的可枚举的属性,返回一个数组,
Object.values(obj) 返回一个数组,其元素是在对象上找到的枚举属性值,Object.entries()返回一个数组,其元素是与直接在object上找到的可枚举属性键值对相对应的数组。属性的顺序与通过手动循环对象的属性值所给出的顺序相同。

Object.defineProperties(o, {    'age': {        value: 24,        writable: true,        enumerable: true,        configurable: true    },    'sex': {        value: 'male',        writable: false,        enumerable: false,        configurable: false    }})console.log(Object.getOwnPropertyNames(o)) //["age", "sex"]console.log(Object.keys(o)) //["age"]console.log(Object.values(o)) //[24]const obj = { foo: 'bar', baz: 42 };console.log(Object.entries(obj)); // [ ['foo', 'bar'], ['baz', 42] ]// array like objectconst obj = { 0: 'a', 1: 'b', 2: 'c' };console.log(Object.entries(obj)); // [ ['0', 'a'], ['1', 'b'], ['2', 'c'] ]// array like object with random key orderingconst anObj = { 100: 'a', 2: 'b', 7: 'c' };console.log(Object.entries(anObj)); // [ ['2', 'b'], ['7', 'c'], ['100', 'a'] ]

6. Object.preventExtensions(obj) / Object.isExtensible(obj)

方法用于锁住对象属性,使其不能够拓展,也就是不能增加新的属性,但是属性的值仍然可以更改,也可以把属性删除,返回值是对象本身. Object.isExtensible用于判断对象是否可以被拓展

console.log(Object.isExtensible(o)) //trueo.lastName = 'Sun'console.log(o.lastName) //Sun ,此时对象可以拓展Object.preventExtensions(o)console.log(Object.isExtensible(o)) //falseo.lastName = "ByronSun"console.log(o.lastName) //ByronSun,属性值仍然可以修改//delete o.lastNameconsole.log(o.lastName) //undefined仍可删除属性o.firstname = 'Byron' //Can't add property firstname, object is not extensible 不能够添加属性

7. Object.seal(obj) / Object.isSealed(obj)

方法用于把对象密封,也就是让对象既不可以拓展也不可以删除属性(把每个属性的configurable设为false),单数属性值仍然可以修改,Object.isSealed由于判断对象是否被密封

var obj = {    name: 'o',    age: 24}Object.seal(obj)console.log(Object.isSealed(obj)) // truedelete obj.nameconsole.log(obj) // {name: "o", age: 24}

8. Object.freeze(obj) / Object.isFrozen(obj)

完全冻结对象,在seal的基础上,属性值也不可以修改(每个属性的wirtable也被设为false)

var obj = {    name: 'o',    age: 24}Object.freeze(obj)obj.name = '1111'console.log(obj) // {name: "o", age: 24}

8. Object.assign(target, …sources)

Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
Object.assign 方法只会拷贝源对象自身的并且可枚举的属性到目标对象。
注意,Object.assign 会跳过那些值为 null 或 undefined 的源对象。

参数: target 目标对象。sources 源对象。
返回值: 目标对象。

var obj = { a: 1 };var copy = Object.assign({}, obj);console.log(copy); // { a: 1 }var o1 = { a: 1 };var o2 = { b: 2 };var o3 = { c: 3 };var obj = Object.assign(o1, o2, o3);console.log(obj); // { a: 1, b: 2, c: 3 }console.log(o1);  // { a: 1, b: 2, c: 3 }, 注意目标对象自身也会改变。
原创粉丝点击