ES6--对象的扩展
2017-09-18 18:15
344 查看
属性和方法的简写
属性
方法
属性表达式
可以把表达式作为属性名
表达式还可以用于定义方法名
ES6新的写法是让我们定义属性名,方法名等边更加灵活了。
Object.assign()
用来将源对象(source)的所有可枚举属性(方法),复制到目标对象(target)
至少需要两个对象作为参数,如果参数不是对象就报错。
用法
作用
一、为对象添加属性
上面方法通过 assign 方法,将 x 属性和 y 属性添加到 Point 类的对象实例。
二、为对象添加方法
上面代码使用了对象属性的简洁表示法,直接将两个函数放在大括号中,再使用 assign 方法添加到 SomeClass.prototype 之中。
这个方法让我想起了解构赋值那部分:为对象添加方法
不知道还记得么,如果在Object.assign()里将Math作为源对象那么会将所有的方法都复制到新对象,并不是想要达到的效果,具体问题使用合理的,这里只是让大家回忆一下哈。
三、克隆对象
很容易理解,将origin复制一份到空对象,那么空对象就有了origin(源对象的一切方法和属性)。
四、合并多个对象
将多个合并到一个(空或非空)对象。
当对象中有同名的属性时,后面的会覆盖前面的。很合理
五、为属性指定默认值
上面代码中,DEFAULTS 对象是默认值,options 对象是用户提供的参数。assign 方法将 DEFAULTS 和 options 合并成一个新对象
Object.is()
Object.is()用来比较两个值是否严格相等。它与(===)的行为基本一致,不同之处:一是+0不等于-0,二是NaN等于自身。
这个方法算是对以前严格比较的补充吧,具体开发中如果认为+0 等于-0 时候用(===),不等的时候用Object.is(),NaN同理。更全面了。
Object.observe() Object.unobserve()
用来监听对象(以及数组)的变化。一旦发生变化,就出发回调。
一般情况下,Object.observe 方法接受两个参数,第一个参数是监听的对象,第二个函数是一个回调函数。一旦监听对象发生变化(比如新增或删除一个属性),就会触发这个回调函数。
上面代码中,Object.observer 方法监听 user 对象。一旦该对象发生变化,就自动生成 fullName 属性。
Object.observe 方法目前共支持监听六种变化
add:添加属性
update:属性值的变化
delete:删除属性
setPrototype:设置原型
reconfigure:属性的 attributes 对象发生变化
preventExtensions:对象被禁止扩展(当一个对象变得不可扩展时,也就不必再监听了)
Object.observe 方法还可以接受第三个参数,用来指定监听的事件种类
Object.unobserve 方法用来取消监听
属性
//ES6 function(x, y){ return {x,y} } //原来 function(x, y){ return {x:x, y:y} }
方法
//ES6 var obj = { method(){ return "hello" } } //原 var obj = { method:function(){ return "hello" } }
属性表达式
可以把表达式作为属性名
let abc = 'foo' let obj = { [abc] : true, ['a'+'bc'] : 123 }
表达式还可以用于定义方法名
let obj = { ['h'+'ello'](){ return "hi" } } obj.hello();//hi
ES6新的写法是让我们定义属性名,方法名等边更加灵活了。
Object.assign()
用来将源对象(source)的所有可枚举属性(方法),复制到目标对象(target)
至少需要两个对象作为参数,如果参数不是对象就报错。
用法
var target = {a:1} var source1 = {b:2} var source2 = {c:3} Object.assign(target,source1,source2); target //{a:1,b:2,c:3}
作用
一、为对象添加属性
class Point{ constructor(x,y){ Object.assign(this, {x,y}) } }
上面方法通过 assign 方法,将 x 属性和 y 属性添加到 Point 类的对象实例。
二、为对象添加方法
Object.assign(SomeClass.prototype, { someMethod(arg1, arg2) { ··· }, anotherMethod() { ··· } }); // 等同于下面的写法 SomeClass.prototype.someMethod = function (arg1, arg2) { ··· }; SomeClass.prototype.anotherMethod = function () { ··· };
上面代码使用了对象属性的简洁表示法,直接将两个函数放在大括号中,再使用 assign 方法添加到 SomeClass.prototype 之中。
这个方法让我想起了解构赋值那部分:为对象添加方法
let {cos,sin,tan} = Math;
不知道还记得么,如果在Object.assign()里将Math作为源对象那么会将所有的方法都复制到新对象,并不是想要达到的效果,具体问题使用合理的,这里只是让大家回忆一下哈。
三、克隆对象
function clone(origin){ return Object.assign({}, origin); }
很容易理解,将origin复制一份到空对象,那么空对象就有了origin(源对象的一切方法和属性)。
四、合并多个对象
let merge = (...sources) => Object.assign({}, ...sources);
将多个合并到一个(空或非空)对象。
let source1 = {a:1} let source2 = {a:1,b:2} let source3 = {a:3,b:3,c:3}; let target = Object.assign({},source1,source2,source3); console.log(target);
当对象中有同名的属性时,后面的会覆盖前面的。很合理
五、为属性指定默认值
const DEFAULTS = { logLevel: 0, outputFormat: 'html' }; function processContent(options) { let options = Object.assign({}, DEFAULTS, options); }
上面代码中,DEFAULTS 对象是默认值,options 对象是用户提供的参数。assign 方法将 DEFAULTS 和 options 合并成一个新对象
Object.is()
Object.is()用来比较两个值是否严格相等。它与(===)的行为基本一致,不同之处:一是+0不等于-0,二是NaN等于自身。
+0 === -0 //true NaN === NaN // false Object.is(+0, -0) // false Object.is(NaN, NaN) // true
这个方法算是对以前严格比较的补充吧,具体开发中如果认为+0 等于-0 时候用(===),不等的时候用Object.is(),NaN同理。更全面了。
Object.observe() Object.unobserve()
用来监听对象(以及数组)的变化。一旦发生变化,就出发回调。
一般情况下,Object.observe 方法接受两个参数,第一个参数是监听的对象,第二个函数是一个回调函数。一旦监听对象发生变化(比如新增或删除一个属性),就会触发这个回调函数。
var user = {}; Object.observe(user, function(changes){ changes.forEach(function(change) { user.fullName = user.firstName+" "+user.lastName; }); }); user.firstName = 'Michael'; user.lastName = 'Jackson'; user.fullName // 'Michael Jackson'
上面代码中,Object.observer 方法监听 user 对象。一旦该对象发生变化,就自动生成 fullName 属性。
Object.observe 方法目前共支持监听六种变化
add:添加属性
update:属性值的变化
delete:删除属性
setPrototype:设置原型
reconfigure:属性的 attributes 对象发生变化
preventExtensions:对象被禁止扩展(当一个对象变得不可扩展时,也就不必再监听了)
Object.observe 方法还可以接受第三个参数,用来指定监听的事件种类
Object.observe(o, observer, ['delete']);
Object.unobserve 方法用来取消监听
Object.unobserve(obj, observer);
相关文章推荐
- es6对象扩展(七)
- ES6 —(对象的扩展)
- ES6--内置对象的扩展
- [js高手之路] es6系列教程 - 对象功能扩展详解
- ES6-对象的扩展-super关键字
- es6 对象的扩展运算符
- ES6(八) 对象的扩展
- ES6系列之---对象的扩展函数
- ES6-对象的扩展-属性的可枚举性和遍历
- ES6-对象的扩展-_proto_ 属性,Object.setPrototypeOf(),Object.getProtitypeOf()
- ES6 - Note3:数组、对象与函数的扩展
- 【读书笔记】【深入理解ES6】#4-扩展对象的功能性
- ES6 对对象的扩展
- ES6对象扩展
- ES6——对象扩展
- es6对象的扩展
- ES6-对象的扩展-Object.keys(),Object.values(),Object.entries()
- ES6对象的扩展
- ES6-对象的扩展-属性名表达式
- 如何理解es6语法的,对象前面加三个点(...) 对象的解构赋值和扩展