ECMAScript5 Object新属性方法

/###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) //24
o.age = 25

for (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 object
const obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.entries(obj)); // [ ['0', 'a'], ['1', 'b'], ['2', 'c'] ]

// array like object with random key ordering
const 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)) //true
o.lastName = 'Sun'
console.log(o.lastName) //Sun ,此时对象可以拓展

Object.preventExtensions(o)
console.log(Object.isExtensible(o)) //false

o.lastName = "ByronSun"
console.log(o.lastName) //ByronSun,属性值仍然可以修改

//delete o.lastName
console.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)) // true

delete obj.name

console.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 }, 注意目标对象自身也会改变。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值