js Object方法总结

qz_Jhonny 2017-12-19 02:59:19
剩余参数:http://www.jb51.net/article/67726.htm
js拓展运算符:http://blog.csdn.net/qq_30100043/article/details/53391308
Object.assign
Object.assign(target, ...sources)
函数参数为一个目标对象(该对象作为最终的返回值),源对象(此处可以为任意多个)。通过调用该函数可以拷贝所有可被枚举的自有属性值到目标对象中
1. 可被枚举的属性
2. 自有属性
3. string或者Symbol类型是可以被直接分配的
es5的实现方式
if (typeof Object.assign != 'function') {
(function () {
Object.assign = function (target) {
'use strict';
if (target === undefined || target === null) {
throw new TypeError('Cannot convert undefined or null to object');
}
var output = Object(target);
for (var index = 1; index < arguments.length; index++) {
var source = arguments[index];
if (source !== undefined && source !== null) {
for (var nextKey in source) {//通过for in 过滤出来的都是可枚举的属性
if (source.hasOwnProperty(nextKey)) {//判断是否是自有的属性
output[nextKey] = source[nextKey];
}
}
}
}
return output;
};
})();
}
注意:
1、使用 Object.defineProperty 初始化的对象默认是不可枚举的属性
2、对于可枚举的对象我们可以直接使用Object.keys()获得(自身的),或者使用for-in循环遍历出来(包括原型链上的).
3、对于只读的属性,当分配新的对象覆盖他的时候,将抛出异常:

浅拷贝一个对象
Object.assign() 方法只能拷贝源对象的可枚举的自身属性,同时拷贝时无法拷贝属性的特性们(如:configurabel,writealbe……),而且访问器属性会被转换成数据属性,也无法拷贝源对象的原型,该方法配合 Object.create() 方法可以实现上面说的这些。
Object.create(
Object.getPrototypeOf(obj), //拷贝原型上的对象
Object.getOwnPropertyDescriptors(obj) //拷贝自有属性的(包括不可枚举、包括属性的特性)
);


Object.create
Object.create() 方法会使用指定的原型对象及其属性去创建一个新的对象。
Object.create(proto, [ propertiesObject ])
即创建一个新对象,让proto[必须参数,可以为null]成为新对象的原型对象,propertiesObject [可选参数]成为新对象的数据属性

// 创建一个原型为null的空对象
var o = Object.create(null);

o = {};
// 以字面量方式创建的空对象就相当于(以Object.prototype为原型的空对象):
o = Object.create(Object.prototype);

o = Object.create(Object.prototype, {
// foo会成为所创建对象的数据属性
foo: {
writable:true,
configurable:true,
value: "hello"
},
// bar会成为所创建对象的访问器属性
bar: {
configurable: false,
get: function() { return 10 },
set: function(value) {
console.log("Setting `o.bar` to", value);
}
}
});

function Constructor(){}
o = new Constructor();
// 上面的一句就相当于:
o = Object.create(Constructor.prototype);
// 当然,如果在Constructor函数中有一些初始化代码,Object.create不能执行那些代码

// 创建一个以另一个空对象为原型,且拥有一个属性p的对象
o = Object.create({}, { p: { value: 42 } })
// 省略了的属性特性默认为false,所以属性p是不可写,不可枚举,不可配置的:
o.p = 24
o.p
//42
delete o.p
//false

o.q = 12
for (var prop in o) {
console.log(prop)
}
//"p"

//创建一个可写的,可枚举的,可配置的属性p
o2 = Object.create({}, {
p: {
value: 42,
writable: true,
enumerable: true,
configurable: true
}
});

Object.defineProperties()
该方法直接在一个对象上定义新的属性或修改现有属性,并返回该对象。该方法和Object.defineProperty()相比较,就是可以一次定义多个属性
Object.defineProperties(obj, props)

var obj = {};
Object.defineProperties(obj, {
"property1": {
value: true,
writable: true
},
"property2": {
value: "Hello",
writable: false
}
// 等等.
});
alert(obj.property2) //弹出"Hello"


Object.defineProperty()
MDN
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

http://www.cnblogs.com/diligenceday/p/4394421.html#_label0

该方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。
Object.defineProperty(obj, prop, descriptor)

在 Javascript 中, 属性 由一个字符串类型的“名字”(name)和一个“属性描述符”(property descriptor)对象构成。
对象里目前存在的属性描述符有两种主要形式:数据描述符和存取描述符。数据描述符是一个拥有可写或不可写值的属性。存取描述符是由一对 getter-setter 函数功能来描述的属性。描述符必须是两种形式之一;不能同时是两者。

数据描述符和存取描述符均具有以下可选键值:
configurable
当且仅当该属性的 configurable 为 true 时,该属性描述符才能够被改变,同时该属性也能从对应的对象上被删除。默认为 false。如果描述符的 configurable 特性为false,那么除了 writable 外,其他特性都不能被修改,writable 特性也只能从true修改为 false,并且数据和存取描述符也不能相互切换、属性也不能删除。
enumerable
当且仅当该属性的 enumerable 为 true 时,该属性才能够出现在对象的枚举属性中。默认为 false。如果为true则可以通过Object.keys()和for...in...遍历(包括原型链上的可枚举)

数据描述符同时具有以下可选键值:
value
该属性对应的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。默认为 undefined。
writable
当且仅当该属性的 writable 为 true 时,该属性才能被赋值运算符改变。默认为 false。

存取描述符同时具有以下可选键值:
get
一个给属性提供 getter 的方法,如果没有 getter 则为 undefined。该方法返回值被用作属性值。默认为 undefined。
set
一个给属性提供 setter 的方法,如果没有 setter 则为 undefined。该方法将接受唯一参数,并将该参数的新值分配给该属性。默认为 undefined。

记住,这些选项不一定是自身属性,如果是继承来的也要考虑。为了确认保留这些默认值,你可能要在这之前冻结 Object.prototype,明确指定所有的选项,或者将__proto__属性指向null。

如果对象中不存在指定的属性,Object.defineProperty()就创建这个属性。当描述符中省略某些字段时,这些字段将使用它们的默认值。拥有布尔值的字段的默认值都是false。value,get和set字段的默认值为undefined。定义属性时如果没有get/set/value/writable,那它被归类为数据描述符。

注:var o = {a:'123'}字面量方式创建的属性默认为数据描述符,且其configurable、enumerable、writable都为true

var o = {};
o.a = 1;
// 等同于 :
Object.defineProperty(o, "a", {
value : 1,
writable : true,
configurable : true,
enumerable : true
});

// 另一方面,
Object.defineProperty(o, "a", { value : 1 });
// 等同于 :
Object.defineProperty(o, "a", {
value : 1,
writable : false,
configurable : false,
enumerable : false
});

实例:
var obj = {};
Object.defineProperty(obj, "name", {
configurable:true,
enumerable : false,
set : function(name) {
this._name = name+" afterfix";
},
get : function() {
return "prefix " + this._name;
}
});
obj.name = "nnnn";
console.log( obj.name );

var obj1 = {};
Object.defineProperties(obj1,{
x : {value : "x"},
y : {enumerable : true},
z : {writable : true}
});
for(var p in obj1)console.log( p );

Object.defineProperty(obj1, "favor",{
writable : true,
configurable : true,
value : "poppin"
});
...全文
115 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

87,993

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧