JS中的Object.assign()、Object.create()、Object.defineProperty()
2016-10-24 20:25
951 查看
1. Object.assign()
首先看一下函数的定义:函数参数为一个目标对象(该对象作为最终的返回值),源对象(此处可以为任意多个)。通过调用该函数可以拷贝所有可被枚举的自有属性值到目标对象中。
Object.assign(target, …sources)
这里我们需要强调的三点是:
可被枚举的属性:
在JavaScript中,对象的属性分为可枚举和不可枚举之分,它们是由属性的enumerable值决定的。可枚举性决定了这个属性能否被for…in查找遍历到。
js中基本包装类型的原型属性是不可枚举的,如Object, Array, Number等,如果你写出这样的代码使用
for...in遍历其中的属性,将会什么都不会发生,不会报错,能够继续往下执行,看起来就是直接跳过去了。
如果对象不可枚举,则方法
for…in
JSON.stringify()
Object.keys()都会失效。
自有属性:
区别于原型属性,不是从原型链继承而来的,例如:
function Obj () {
this.z = 3; //自有属性
}
//对象会继承原型里的属性
Obj.prototype.x = 1;//非自有属性
Obj.prototype.y = 2;//非自有属性
string或者Symbol类型,可以被直接分配
示例一:
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 }, target object itself is changed.
此例子表明,
Object.assign不仅返回一个新拼接出来的值,同时也会改变第一个参数(target)的值。
var obj = Object.create({ foo: 1 }, { // foo is an inherit property. bar: { value: 2 // bar is a non-enumerable property. }, baz: { value: 3, enumerable: true // baz is an own enumerable property. } }); var copy = Object.assign({}, obj); console.log(copy); // { baz: 3 }
这个例子中,因为对象obj是使用
Ob 4000 ject.create()构造,所以
{foo:1}是obj继承的原型,obj中的第二个属性显式声明为可枚举,所以最后
copy中拷贝过去的属性只有
baz
2. Object.create()
Object.create(proto [, propertiesObject ])是E5中提出的一种新的对象创建方式,第一个参数是要继承的原型,如果不是一个子函数,可以传一个null,第二个参数是对象的属性描述符,这个参数是可选的。
function Car (desc) { this.desc = desc; this.color = "red"; } Car.prototype = { getInfo: function() { return 'A ' + this.color + ' ' + this.desc + '.'; } }; //instantiate object using the constructor function var car = Object.create(Car.prototype); car.color = "blue"; alert(car.getInfo());
数据属性
writable:是否可任意写
configurable:是否能够删除,是否能够被修改
enumerable:是否能用 for in 枚举
value:值
访问属性:
get(): 访问
set(): 设置
newObj = Object.create(obj,{ t1:{ value:'yupeng', writable:true }, bar: { configurable: false, get: function() { return bar; }, set: function(value) { bar=value } } })
3. Object.defineProperty()
详细见于这里相关文章推荐
- js object.create()、Object.defineproperty()、,Object.keys()...for..in,for..each
- 使用Object.defineProperty实现简单的js双向绑定
- JS中的双向数据绑定及Object.defineProperty方法
- js中神奇的Object.defineProperty方法
- vue.js关于Object.defineProperty的利用原理
- ECMAScript5 Object的新属性方法(包含Object.create()、Object.defineProperty()等)
- JS中的双向数据绑定及Object.defineProperty方法
- JS 对象复制Object.assign和Object.create
- JS的Object.defineProperty
- JS进阶篇--JS apply的巧妙用法以及扩展到Object.defineProperty的使用
- js中的Object.defineProperty方法
- Js中的Object.defineProperty
- Vue.js 源码学习笔记 -- 分析前准备2 -- Object.defineProperty
- 使用Object.defineProperty实现简单的js双向绑定
- JS Object.getOwnPropertyDescriptor()和Object.defineProperty()
- Vue.js双向绑定内核—Object.defineProperty解析
- javascript面向对象之Object.defineProperty(a,b,c)
- Object.defineProperty vs __defineGetter__ vs normal
- JS模式:Mixin混合模式,=_=!就是常见的Object.create()或者_extend()
- javascript的创建对象object.create()和属性检测hasOwnPrototype()和propertyIsEnumerable()