001 -常用对象方法(1)

0、创建一个关联到 anotherObject 的对象

var anotherObject = {
     a:2
};
// 创建一个关联到 anotherObject 的对象
var myObject = Object.create( anotherObject );
myObject.a; // 2

1、深拷贝:(复制)

var newObj = JSON.parse( JSON.stringify( someObj ) )
解析:

// JSON.stringify语法解析
语法:JSON.stringify(value [, replacer] [, space])
官方解析 : 将对象转为JSON字符串
用处:将一个对象解析成字符串对象,可用alert  , console 打印出详细对象内容 
//JSON.parse语法解析
语法:JSON.parse(text[, reviver])
官方解析:将一个 JSON 字符串转换为对象。
参数说明:
text:必需, 一个有效的 JSON 字符串。
reviver: 可选,一个转换结果的函数, 将为对象的每个成员调用此函数。

备注:这种方法需要保证对象是JSON安全的,所以适用于部分情况


2、浅拷贝(复制)

利用ES6的Objiect.assign(...)方法实现浅复制
var newObj = Object.assign( {}, myObject );

3、属性描述符

//Object.getOwnPropertyDescriptor(object, propertyname) 获取指定对象的自身属性描述符。自身属性描述符是指直接在对象上定义(而非从对象的原型继承)的描述符。

var myObject = { a:2 };
Object.getOwnPropertyDescriptor( myObject , 'a' );
// {
// value: 2,          值
// writable: true,  可写的
// enumerable: true,可枚举的
// configurable: true 可配置的
// }

// Object.defineProperty( ... );添加一个新属性或者修改一个已有属性(如果它是configurable)并对特性进行设置
var myObject = {};
Object.defineProperty( myObject, "a", {
     value: 2,
     writable: true,
     configurable: true,
     enumerable: true
} );
myObject.a; // 2


3.1、区分属性是否可枚举

var myObject = {};
Object.defineProperty(
    myObject,
    "a",
// 让 a 像普通属性一样可以枚举
{
    enumerable: true,
    value: 2
});
Object.defineProperty(对象|121 myObject,
    "b",
// 让 b 不可枚举
{
    enumerable: false,
    value: 3
});
myObject.propertyIsEnumerable("a"); // true
myObject.propertyIsEnumerable("b"); // false
Object.keys(myObject); // ["a"]
Object.getOwnPropertyNames(myObject); // ["a", "b"]
propertyIsEnumerable(..) 会检查给定的属性名是否直接存在于对象中(而不是在原型链
上)并且满足 enumerable:true。
Object.keys(..) 会返回一个数组,包含所有可枚举属性,Object.getOwnPropertyNames(..)
会返回一个数组,包含所有属性,无论它们是否可枚举。
in 和 hasOwnProperty(..) 的区别在于是否查找 [[Prototype]] 链,然而,Object.keys(..)
和 Object.getOwnPropertyNames(..) 都只会查找对象直接包含的属性。
(目前)并没有内置的方法可以获取 in 操作符使用的属性列表(对象本身的属性以
及 [[Prototype]] 链中的所有属性)。不过你可以递归遍历某个对象的整条
[[Prototype]] 链并保存每一层中使用 Object.keys(..) 得到的属性列表——只包含可枚举属性。


4、对象常量:

结合 writable:false 和 configurable:false 就可以创建一个真正的常量属性(不可修改、重定义或者删除):

var myObject = {};
Object.defineProperty( myObject, "FAVORITE_NUMBER", {
      value: 42,
      writable: false,
      configurable: false
} );

5、禁止扩展:

如 果 你 想 禁 止 一 个 对 象 添 加 新 属 性 并 且 保 留 已 有 属 性, 可 以 使 用 Object.preventExtensions(..):

var myObject = {
      a:2
};
Object.preventExtensions( myObject );
myObject.b = 3;
myObject.b; // undefined
在非严格模式下,创建属性 b 会静默失败。在严格模式下,将会抛出 TypeError 错误。

6、 密封
Object.seal(..) 会创建一个“密封”的对象,这个方法实际上会在一个现有对象上调用Object.preventExtensions(..)

并把所有现有属性标记为 configurable:false。所以,密封之后不仅不能添加新属性,也不能重新配置或者删除任何现有属性

(虽然可以修改属性的值)。


7、 冻结
Object.freeze(..) 会创建一个冻结对象,这个方法实际上会在一个现有对象上调用Object.seal(..) 并把所有“数据访问”

属性标记为 writable:false,这样就无法修改它们的值。这个方法是你可以应用在对象上的级别最高的不可变性,

它会禁止对于对象本身及其任意直接属性的修改(不过就像我们之前说过的,这个对象引用的其他对象是不受影响的)。

你可以“深度冻结”一个对象,具体方法为,首先在这个对象上调用 Object.freeze(..),然后遍历它引用的所有对象

并在这些对象上调用 Object.freeze(..)。但是一定要小心,因为这样做有可能会在无意中冻结其他(共享)对象。









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值