Constructor vs Object
2024-09-29 23:26:59
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([], []); // false var 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
// 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 } });
最新文章
- List拆分成多个集合
- mediawiki安装
- POJ1185 炮兵阵地
- 构建spring+mybatis+redis架构时遇到的小异常
- html css js
- [LeetCode]题解(python):049-Groups Anagrams
- idea编辑器HttpServlet httpServlet = ServletActionContext.getServletContext().getRealPath();方法无法使用
- POJ 2101
- android 界面布局 很好的一篇总结[转]
- POJ 3352 Road Construction (边双连通分量)
- ASP.NET内核几大对象、ASP.NET核心知识(6)
- 那些日常琐事(iPhone上的细小提示,大数据分析)
- 微信小程序-参数传递与事件处理
- 2013年省赛I题 Thrall’s Dream
- 【Pattern】-NO.150.Pattern.1 -【Pattern UML】
- leetcode71
- 开发中CollectionUtils处理集合
- PCL深度图像(1)
- nginx+redis+4个tomcat 负载均衡
- 玩转mongodb(四):细说插入、更新、删除和查询