Constructor vs Object
1. Constructor:是用于创建和初始化类中创建的一个对象的一种特殊方法。
constructor([arguments]){ ... }
在一个类中只能有一个名为 “constructor” 的特殊方法。 一个类中出现多次构造函数 (constructor)
方法将会抛出一个 SyntaxError
错误。
在一个构造方法中可以使用super
关键字来调用一个父类的构造方法。
如果没有显式指定构造方法,则会添加默认的 constructor 方法。
如果不指定一个构造函数(constructor)方法, 则使用一个默认的构造函数(constructor)。
实例:
class Square extends Polygon {constructor(length) {// 在这里, 它调用了父类的构造函数, 并将 lengths 提供给 Polygon 的"width"和"height" super(length, length);// 注意: 在派生类中, 必须先调用 super() 才能使用 "this"。// 忽略这个,将会导致一个引用错误。this.name = 'Square';}get area() {return this.height * this.width;}set area(value) {// 注意:不可使用 this.area = value// 否则会导致循环call setter方法导致爆栈this._area = value;} }
class Polygon {constructor() {this.name = "Polygon";} }class Square extends Polygon {constructor() {super();} }class Rectangle {}Object.setPrototypeOf(Square.prototype, Rectangle.prototype);console.log(Object.getPrototypeOf(Square.prototype) === Polygon.prototype); //false console.log(Object.getPrototypeOf(Square.prototype) === Rectangle.prototype); //true let newInstance = new Square(); console.log(newInstance.name); //Polygon
这里,Square类的原型被改变,但是在正在创建一个新的正方形实例时,仍然调用前一个基类Polygon的构造函数。
如果不指定构造方法,则使用默认构造函数。对于基类,默认构造函数是:
constructor() {}
对于派生类,默认构造函数是:
constructor(...args) {super(...args); }
2. Object:
(1)Object.assign()
可以用作对象的复制
var obj = { a: 1 }; var copy = Object.assign({}, obj); console.log(copy); // { a: 1 }
可以用作对象的合并
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 }, 注意目标对象自身也会改变。
(2)Object.is()
Object.is('haorooms', 'haorooms'); // true Object.is(window, window); // true Object.is('foo', 'bar'); // false Object.is([], []); // falsevar test = { a: 1 }; Object.is(test, test); // true Object.is(null, null); // true// 特例 Object.is(0, -0); // false Object.is(-0, -0); // true Object.is(NaN, 0/0); // true
(3)Object.keys()
这个方法会返回一个由给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用 for...in 循环遍历该对象时返回的顺序一致 (两者的主要区别是 一个 for-in 循环还会枚举其原型链上的属性)。
/* 类数组对象 */ var obj = { 0 : "a", 1 : "b", 2 : "c"}; alert(Object.keys(obj)); // 弹出"0,1,2"/* 具有随机键排序的数组类对象 */ var an_obj = { 100: 'a', 2: 'b', 7: 'c' }; console.log(Object.keys(an_obj)); // console: ['2', '7', '100']
(4)Object.create()
Object.create(proto, [ propertiesObject ])
第二个参数是可选的,主要用于指定我们创建的对象的一些属性,(例如:是否可读、是否可写,是否可以枚举等等)可以通过下面案例来了解第二个参数!
ar o; 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) } }})// 创建一个以另一个空对象为原型,且拥有一个属性p的对象 o = Object.create({}, { p: { value: 42 } })// 省略了的属性特性默认为false,所以属性p是不可写,不可枚举,不可配置的: o.p = 24 o.p //42 o.q = 12 for (var prop in o) {console.log(prop) } //"q"delete o.p //false//创建一个可写的,可枚举的,可配置的属性p o2 = Object.create({}, { p: { value: 42, writable: true, enumerable: true, configurable: true } });
转载于:https://www.cnblogs.com/liuwei-0313/p/9912005.html
Constructor vs Object相关推荐
- 详解Javascript中的Object对象
本文地址:http://luopq.com/2016/02/28/Object-in-Javascript/,转载请注明 Object是在javascript中一个被我们经常使用的类型,而且JS中的所 ...
- JavaScript Object对象
原文:JavaScript Object对象 Object对象 1. 介绍 Object对象,是所有JavaScript对象的超类(基类).Object.prototype(Obecjt的原型)定义了 ...
- Object Builder Application Block (2)
三.ObjectBuilder Application Block ObjectBuilder一开始出现于Microsoft所提出的Composite UI Application Block,主司对 ...
- js map 只输出key_什么时候适合使用Map而不是Object
「Map」映射是一种经典的数据结构类型,其中数据以 「key/value」 的键值对形式存在 Map 默认值:默认不包含任何值,只包含显式插入的键 类型:任意 长度:键值对个数通过 size 属性获取 ...
- 数据类型的判断 --Object.prototype.toString.call(obj)精准检测对象类型
数据类型的判断 typeof typeof返回一个表示数据类型的字符串,返回结果包括:number.boolean.string.symbol.object.undefined.function等7种 ...
- 反射_Class对象功能_获取Constructor
* Constructor:构造方法 * 创建对象: * T newInstance(Object... initargs) * 如果使用空参数构造方法创建对象,操作可以简化: ...
- JavaScript学习笔记(四)--复杂数据类型Object
Object是在javascript中一个被我们经常使用的类型,而且JS中的所有对象都是继承自Object对象的.虽说我们平时只是简单地使用了Object对象来存储数据,并没有使用到太多其他功能,但是 ...
- [译] Object.assign 和 Object Spread 之争, 用谁?
原文链接 thecodebarbarian.com/object-assi- 在 2018 年 Object Rest/Spread Proposal 达到了 stage 4,这意味着在未来它会将入到 ...
- java中typeof_深入剖析JavaScript中的数据类型判断(typeof instanceof prototype.constructor)...
关于JavaScript中的类型判断,我想大部分JavaScripter 都很清楚 typeof 和 instanceof,却很少有人知道 constructor,以及constructor与前面二 ...
最新文章
- shell 脚本简单入门
- Inversion Sequence(csu 1555)
- c语言申请字符串动态,【分享】C语言动态长度字符串
- 自然语言处理中的符号表征
- linux etc 漏洞利用,漏洞利用 | 看我如何利用Kerberos EoP渗透你的Linux系统
- 性能测试之性能测试的基础理论
- 2013递归求解单链表中的结点个数(C++,附递归函数思路讲解与手绘图)
- 2021牛客寒假算法基础集训营2,签到题FHIJ
- JFFS2 文件系统及新特性介绍
- matlab仿真高尔顿正态分布源码,《正态分布》教学设计
- 巧除Word插入水印后页眉处的折线(转)
- Vue的一些知识汇总---希望对你有用
- vue3中播放视频和m3u8后缀的视频解决办法
- otsu天空分割 matlab,matlab图像处理--Otsu阈值分割
- Arduino学习总结(未完待续)
- 数据库系统结构、数据库系统的组成
- 快钱提现 php,快钱账户提现付款操作手册
- 微信小程序体验版ios白屏 安卓报错 {“errMsg“:“hideLoading:fail:toast can‘t be found“}
- Failed to resolve directive: XXX
- infocom 2020 整理
热门文章
- 服务器配置能连多少个小程序,每个服务器能配置多少小程序
- u8 api开发报类型不匹配错误_小程序云开发入门学习,小程序支付功能常见错误汇总及解决方案...
- python 如何快速判断列表是否相同_python如何判断两个list是否相等
- HTML学习思维导图
- Spring Cloud with Turbine
- vSphere5.1升级5.5(二)——升级Esxi主机及vmware tools
- java:输出流程printStream
- 以后再别这样做,否则你的苹果华为将挂在墙上
- 两个栈实现队列+两个队列实现栈----java
- 45.国际化-选择使用资源文件