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(..) 得到的属性列表——只包含可枚举属性。
结合 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(..)。但是一定要小心,因为这样做有可能会在无意中冻结其他(共享)对象。