今天学习javascript面向对象,在学习Obejct方法时了解到create方法,偶像想起之前使用的assign方法,顺带查找一番,感觉这篇博客讲解详细,遂转载。

先简单提一下装饰器函数,许多面向对象的语言都有修饰器(Decorator)函数,用来修改类的行为。目前,es6中有个提案将这项功能,引入了 ECMAScript。而在ts中则完全支持装饰器。这段时间看ng2看得到我头大。

Object.assing(target,…sources)

参考自微软的开发者社区。

用途:将来自一个或多个源对象中的值复制到一个目标对象。

语法:Object.assign(target, …sources );

参数:  target, 必需。可枚举属性复制到的对象。
            …sources,必需。从其中复制可枚举属性的对象。
异常: 如果存在分配错误,此函数将引发 TypeError,这将终止复制操作。如果目标属性不可写,则将引发 TypeError
备注:null 或 undefined 源被视为空对象一样对待,不会对目标对象产生任何影响。

/*合并对象*/

例1,
var first = { name: "Bob" };
var last = { lastName: "Smith" }; var person = Object.assign(first, last);
console.log(person);/*{ name: 'Bob', lastName: 'Smith' }*/ /*克隆对象*/
例2,
var obj = { person: "Bob Smith"};
var clone = Object.assign({}, obj);
console.log(obj);/*{ person: 'Bob Smith' }*/ 这里探究备注内容,"nullundefined 源被视为空对象一样对待,不会对目标对象产生任何影响。"
var test=null;
var test1=Object.assign({},test);
console.log(test1);/*{}*/
var test2=undefined;
var test4=Object.assign({},test2);
console.log(test4);/*{}*/

通过以上可以看出,test1和test4依然空对象,印证了备注里面的内容。

Object.create(prototype,descriptors)

用途:创建一个具有指定原型且可选择性地包含指定属性的对象。

参数:prototype       必需。  要用作原型的对象。  可以为 null

          descriptors     可选。  包含一个或多个属性描述符的 JavaScript 对象。

“数据属性”是可获取且可设置值的属性。  数据属性描述符包含 value 特性,以及 writableenumerable 和 configurable 特性。  如果未指定最后三个特性,则它们默认为 false。  只要检索或设置该值,“访问器属性”就会调用用户提供的函数。  访问器属性描述符包含 set 特性和/或 get 特性。

返回值:一个具有指定的内部原型且包含指定的属性(如果有)的新对象。
 
异常:  如果满足下列任一条件,则将引发 TypeError 异常:
  • prototype 参数不是对象且不为 null
  • descriptors 参数中的描述符具有 value 或 writable 特性,并具有 get 或 set 特性。
  • descriptors 参数中的描述符具有不为函数的 get 或 set 特性。

备注:若要停止原型链,可以使用采用了 null prototype 参数的函数。  所创建的对象将没有原型。

创建使用null原型的对象并添加两个可枚举的属性。

例1,

var newObj = Object.create(null, {
size: {
value: "large",
enumerable: true
},
shape: {
value: "round",
enumerable: true
}
}); document.write(newObj.size + "<br/>");/*large*/
document.write(newObj.shape + "<br/>");/*round*/
document.write(Object.getPrototypeOf(newObj));/*null*/ 创建一个具有与 Object 对象相同的内部原型的对象。 该对象具有与使用对象文本创建的对象相同的原型。
Object.getPrototypeOf 函数可获取原始对象的原型。 若要获取对象的属性描述符,可以使用Object.getOwnPropertyDescriptor 函数 例2,
var firstLine = { x: undefined, y: undefined };

var secondLine = Object.create(Object.prototype, {
x: {
value: undefined,
writable: true,
configurable: true,
enumerable: true
},
y: {
value: undefined,
writable: true,
configurable: true,
enumerable: true
}
}); document.write("first line prototype = " + Object.getPrototypeOf(firstLine));/*first line prototype = [object Object])*/
document.write("<br/>");
document.write("second line prototype = " + Object.getPrototypeOf(secondLine));/*first line prototype = [object Object]*/ 创建一个具有与 Shape 对象相同的内部原型的对象。
例3,
// Create the shape object.
var Shape = { twoDimensional: true, color: undefined, hasLineSegments: undefined }; var Square = Object.create(Object.getPrototypeOf(Shape)); 要区分数据属性还是访问器属性。
以下是那数据属性作为例子说明,配合访问器属性的Object.create()用法暂时还木有搞定。
例4,
var Shape = { twoDimensional: true, color: undefined, hasLineSegments: undefined };

var Square = Object.create(Object.getPrototypeOf(Shape),{xiaoming:{
value:"hello,world",
writable:true, }});
Square.xiaoming="xiaohua";
console.log(Square.xiaoming);/*xiaohua8*/
如果默认writable、enumerable、configurable都是false。 原文出处: http://www.onlyfordream.cn/2018/03/19/es6%E4%B8%ADobject-create%E5%92%8Cobject-assign/

(转)es6中object.create()和object.assign()的更多相关文章

  1. Object.create 和 Object.assign

    Object.assign(target, ...source) 1.Object.assign方法只会拷贝源对象自身(不包括原型)的并且可枚举的属性到目标对象,使用源对象的get和目标对象的set, ...

  2. Object.create 以及 Object.setPrototypeOf

    第一部分 Object.crate() 方法是es5中的关于原型的方法, 这个方法会使用指定的原型对象以及属性去创建一个新的对象. 语法 Object.create(proto, [ properti ...

  3. js中的new操作符与Object.create()的作用与区别

    js中的new操作符与Object.create()的作用与区别 https://blog.csdn.net/mht1829/article/details/76785231 2017年08月06日 ...

  4. Object.create() __https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/create

    Object.create() 方法会使用指定的原型对象及其属性去创建一个新的对象. 语法 Object.create(proto[, propertiesObject]) 参数 proto 新创建对 ...

  5. Object.create()和new object()和{}的区别

    Object.create()介绍 Object.create(null) 创建的对象是一个空对象,在该对象上没有继承 Object.prototype 原型链上的属性或者方法,例如:toString ...

  6. js-new、object.create、bind的模拟实现【转载备忘】

    //创建Person构造函数,参数为name,age function Person(name,age){ this.name = name; this.age = age; } function _ ...

  7. Object.create() 实现

    if (typeof Object.create !== 'function') { Object.create = function (o) { function F() {} F.prototyp ...

  8. ES5 Object.create 方法

    Object.create(proto[, propertiesObject])The Object.create() method creates a new object with the spe ...

  9. ES6中map和set用法

    ES6中map和set用法 --转载自廖雪峰的官方网站 一.map Map是一组键值对的结构,具有极快的查找速度. 举个例子,假设要根据同学的名字查找对应的成绩,如果用Array实现,需要两个Arra ...

随机推荐

  1. java前的部分了解(计算机小白)

    一.加密 对称加密: des 3des AES rc4 (数据加密) 会话密钥 非对称加密(成对:公钥/私钥(一个加密一个解密)):RSA DSA 密钥交换 / 数字签名(用私钥加密摘要算法出的一串数 ...

  2. 【技巧】EasyUI分页组件pagination显示项控制

    我们使用easyui分页时,分页组件显示项有很多,默认如下是这样的: 有时候我们并不想显示这么多控制项,我们可以通过属性来控制:如下来自EasyUI官网: 如下写法,在datagrid中使用,如下控制 ...

  3. 基于三层架构下的公共数据访问方法(Sqlite数据库)

    作者总结了一下,使用Winform的三层架构做窗体应用程序,在数据访问方面,有用到纯sql语句方法.参数方法.存储过程方法. 那么什么是三层架构呢? UI---存放Form窗体---(用户所关心的) ...

  4. 聊聊大学期间的我是怎样学习Linux系统的

    高考成绩并不是那么的理想,本科是个普通的二本院校,来到学校之后,整个人其实很迷茫,当时对大学的专业真的是一点都不了解,也不知道自己对哪方面感兴趣,最后选择的专业是电子方面的,其实当时选择专业的时候对电 ...

  5. 常见IO模型

    在socket的通信中,recv,accept,recvfrom(UDP协议接收信息)这些阶段由于需要收到信息,才能继续下面的代码,所以这些阶段叫做阻塞,类似于我们python变成中的input函数, ...

  6. C# [WIN32] [API] Global Hook

    NativeMethods.cs: using System; using System.Runtime.InteropServices; namespace GlobalHook { interna ...

  7. Python之路【目录】

    https://www.cnblogs.com/wupeiqi/articles/4938499.html

  8. pip install beautifulsoup4.失败

    在学习python爬虫时,用到bs4解析网页,开始遇到安装bs出错 Collecting beautifulsoup4Exception:Traceback (most recent call las ...

  9. MySQL data sync to Oracle with OGG(Remote Delivery)

    MySQL to Oracle with OGG 1. Install MySQL: yum install mysql-community-server [root@localhost ~]#  y ...

  10. jsp页面传中文到后台乱码怎么办?

    一般从前台传值到后腰如果传的值是中文的话,又不用post传值方式,到后台显示会显示成乱码的形式.所以以下方法亲测有效防止乱码. 前台jsp页面: var taskTitle = $('#taskTit ...