• 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([], []);           // 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
    //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 } });
     
  • 相关阅读:
    linux系统/var/log目录下的信息详解
    SQL 显示表名显示列名
    P2P平台介绍
    outlook署名最后一行没换行
    CSS3下的渐变文字效果实现
    SSH(poderosa)を使って、さくらのMySQLサーバーに接続する方法
    内网IP外网IP的关联及访问互联网原理
    自己吃的哑巴亏,怎么也要吞下去
    解决Ehcache缓存警告问题
    管理的艺术
  • 原文地址:https://www.cnblogs.com/liuwei-0313/p/9912005.html
Copyright © 2020-2023  润新知