代码之家  ›  专栏  ›  技术社区  ›  dimButTries

使用对象创建对象时创建默认参数。创造

  •  0
  • dimButTries  · 技术社区  · 5 年前

    有没有一种方法可以选择性地声明 dots: {} 从内部 Object.create ?

    正如你所看到的,我已经试过了

    两者都不起作用。

    'use strict'
    
    let Carousel = function(name, dots=true) {
      this.name = name
      this.dots = dots ?? true
    }
    Carousel.prototype.show = function() {
      console.log(`${this.name} and ${this.dots}`)
    }
    
    window.addEventListener('DOMContentLoaded', () => {
      let usps = Object.create(Carousel.prototype, { 
        name: { value: 'element name', writeable: false}
        // dots: { value: true, writeable: false }
      })
      usps.show()
    })
    1 回复  |  直到 5 年前
        1
  •  0
  •   Mr. Hedgehog    5 年前

    不知道你为什么不使用 new 关键字,而不是从prototype创建对象,但在这两种情况下,若将默认值设置为对象的prototype,则会在其上获得点。

    let Carousel = function(name, dots) {
      this.name = name
      this.dots = dots
    }
    Carousel.prototype.show = function() {
      console.log(`${this.name} and ${this.dots}`)
    }
    
    Carousel.prototype.dots = true;
    
    window.addEventListener('DOMContentLoaded', () => {
      let usps = Object.create(Carousel.prototype, { 
        name: { value: 'element name', writeable: false},
      })
      usps.show() // will show that dots equals true
      let usps2 = Object.create(Carousel.prototype, { 
        name: { value: 'element name', writeable: false},
        dots: { value: false, writeable: false }
      });
      usps2.show(); // will show that dots equals false
    })
    

    重要的是,如果你想使用 刚出现的 运算符,则必须修改构造函数,因此如果未设置dots参数,则不会使用 undefined :

    let Carousel = function (name, dots) {
      this.name = name;
      if (dots !== undefined) {
        this.dots = dots;
      }
    };
    Carousel.prototype.show = function () {
      console.log(`${this.name} and ${this.dots}`);
    };
    
    Carousel.prototype.dots = true;
    
    window.addEventListener("DOMContentLoaded", () => {
      let usps = new Carousel("element name");
      usps.show();
      let usps2 = new Carousel("element name 2", false);
      usps2.show();
    });