JSObject静态⽅法讲解⼀、Object.assign()
将多个对象的可枚举属性拷贝到⽬标对象上,并且返回赋值后的⽬标对象。
Object.assign(target, …sources)
target:⽬标对象
…sources:源对象
测试如下:
var source1 = {
name1: 'source1',
age1: 18
};
var source2 = {
name2: 'source2',
age2: 19
};
var target = Object.assign({name: 'target'}, source1, source2);
console.info(JSON.stringify(target));
// 输出如下:
{
"name":"target",
"name1":"source1",
"age1":18,
"name2":"source2",
"age2":19
}
⼆、ate()
获取⼀个类的原型(prototype)对象,返回值为参数类的原型对象。可⽤于类继承。
proto:类原型
测试如下:
function Super1Class() {
this.name = 'Super1Class';
}
Super1Class.prototype = {
super1Method: function() {
console.info('My name is ' + this.name);
}
};
// ⼦类
function MyClass() {
this.name = 'MyClass';
}
MyClass.prototype = ate(Super1Class.prototype);
// 类似于下⾯这种⽅式
// MyClass.prototype = new  Super1Class();
var myClass = new MyClass();
console.info(myClass instanceof Super1Class);
// true
console.info(myClass instanceof MyClass);
// true
console.info(myClass.super1Method());
// My name is MyClass
三、Object.defineProperties()
给对象定义属性,如果存在该属性,则⽤新定义的属性更新已存在的属性,如果不存在该属性,则添加该属性。
Object.defineProperties(obj, props)
obj:被添加属性的对象
props:添加或更新的属性对象
测试如下:
name: 'obj'
};
Object.defineProperties(obj, {
name: {
value: 'newName',
writable: true
},
newProp1: {
value: 'newProp1',
writable: true,
enumerable: true
},
newProp2: {
value: 'newProp2',
writable: true
}
});
console.info(JSON.stringify(obj));
// 输出结果如下
{
"name":"newName",
"newProp1":"newProp1"
}
从以上输出结果可以看到,Object.defineProperties()定义的覆盖属性name只是更新了旧属性name的值及其writable属性,并没有更新name属性的可枚举性。
但是我们通过Object.defineProperties()定义的新属性newProp2默认是不可枚举的,所以在JSON.stringify(obj)时并没有序列化该新定义的属性。
以上结果可以得出结论:
JSON.stringify()序列化对象到JSONObject时,只会序列化该对象可枚举的属性。
四、Object.defineProperty()
在对象上定义新属性,或修改对象现有属性,并返回该对象。
Object.defineProperty(obj, prop, descriptor)
obj:被添加属性的对象
prop:属性名
descriptor:属性描述
测试如下:
var mame = 'obj';
Object.defineProperty(obj, 'name', {
configurable: true,
enumerable: true,
get: function() {
console.info('get name .');
return mame;
},
set: function(newName) {
console.info('set new name is ' + newName);
mame = newName;
}
});
console.info(JSON.stringify(obj));
obj.name = 'xxx';
console.info(JSON.stringify(obj));
// 输出结果如下:
get name .
{"name":"obj"}
set new name is xxx
get name .
{"name":"xxx"}
从以上测试结果可以看出,我们在序列化对象是会调⽤⼀次属性的get⽅法,在给对象属性赋值时,会调⽤⼀次属性的set⽅法。
五、ies()
遍历获取对象上所有可枚举的属性,返回结果是⼀个⼆维数组[['key1', 'value1'], ['key2', 'value2'], ......]
obj:被遍历的对象
测试如下:
name: 'obj',
age: 18
};
var kvs = ies(obj);
console.info(JSON.stringify(kvs));
// [["name","obj"],["age",18]]
for(let [key, value] ies(obj)) {
console.info(key + ' --> ' + value);
// name --> obj, age -->18
}
console.info(key + ' --> ' + value);
/
/ name --> obj, age -->18
});
for(let key in obj) {
console.info('key --> ' + key);
// key --> name, key --> age
}
六、Object.freeze()
将⼀个对象上的属性冻结,阻⽌添加、删除、更新属性到该对象及其原型。返回被冻结的对象。
Object.freeze(obj)
obj:被冻结的对象
测试如下:
'use strict'
var obj = {
name: 'obj'
};
obj['age'] = 18;
obj.name = 'newName';
console.info(JSON.stringify(obj));
// {"name":"newName","age":18}
var o = Object.freeze(obj);
console.info(o === obj);
js 二维数组// true
/
/ 开启严格模式报错
obj['sex'] = 'man';
// Uncaught TypeError: Cannot add property sex, object is not extensible
obj.name = 'updateName';
// Uncaught TypeError: Cannot assign to read only property 'name' of object '#<Object>'
console.info(JSON.stringify(obj));
// {"name":"newName","age":18}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。