【问题标题】:Can you add a new dynamic parameter to an object constructor without changing the object constructor?您可以在不更改对象构造函数的情况下向对象构造函数添加新的动态参数吗?
【发布时间】:2021-12-15 02:04:36
【问题描述】:

我是 Javascript 新手,正在学习对象。我了解到您可以使用原型向对象添加新属性或方法。

function Person(first, last, age, eyecolor) {
  this.firstName = first;
  this.lastName = last;
  this.age = age;
  this.eyeColor = eyecolor;
}

Person.prototype.nationality = "English";

现在我想知道是否也可以在不直接分配新属性或更改对象构造函数的情况下添加带有新参数的新属性。 于是,就变成了:

function Person(first, last, age, eyecolor, nationality) {
  this.firstName = first;
  this.lastName = last;
  this.age = age;
  this.eyeColor = eyecolor;
  this.nationality = nationality;
}

【问题讨论】:

    标签: javascript object constructor prototype


    【解决方案1】:

    您可以通过将原始构造函数包装在一个新函数中来做到这一点,如下所示:

    const originalPerson = Person;
    Person = function(first, last, age, eyecolor, nationality) {
        const instance = new originalPerson(first, last, age, eyecolor);
        instance.nationality = nationality;
        return instance;
    };
    

    现场示例:

    function Person(first, last, age, eyecolor) {
        this.firstName = first;
        this.lastName = last;
        this.age = age;
        this.eyeColor = eyecolor;
    }
    
    const originalPerson = Person;
    Person = function(first, last, age, eyecolor, nationality) {
        const instance = new originalPerson(first, last, age, eyecolor);
        instance.nationality = nationality;
        return instance;
    };
    
    const joe = new Person("Joe", "Bloggs", 42, "brown", "English");
    console.log(joe.nationality);

    你也可以通过继承来实现:

    const originalPerson = Person;
    Person = class extends originalPerson {
        constructor(first, last, age, eyecolor, nationality) {
            super(first, last, age, eyecolor);
            this.nationality = nationality;
        }
    };
    

    现场示例:

    function Person(first, last, age, eyecolor) {
        this.firstName = first;
        this.lastName = last;
        this.age = age;
        this.eyeColor = eyecolor;
    }
    
    const originalPerson = Person;
    Person = class extends originalPerson {
        constructor(first, last, age, eyecolor, nationality) {
            super(first, last, age, eyecolor);
            this.nationality = nationality;
        }
    };
    const joe = new Person("Joe", "Bloggs", 42, "brown", "English");
    console.log(joe.nationality);

    在这两种情况下,我都重新分配了 Person,但您不必这样做,您可以使用 ExtendedPerson 或类似的:

    class ExtendedPerson extends Person {
        constructor(first, last, age, eyecolor, nationality) {
            super(first, last, age, eyecolor);
            this.nationality = nationality;
        }
    }
    

    ...然后使用new ExtendedPerson(/*...*/)

    现场示例:

    function Person(first, last, age, eyecolor) {
        this.firstName = first;
        this.lastName = last;
        this.age = age;
        this.eyeColor = eyecolor;
    }
    
    class ExtendedPerson extends Person {
        constructor(first, last, age, eyecolor, nationality) {
            super(first, last, age, eyecolor);
            this.nationality = nationality;
        }
    }
    const joe = new ExtendedPerson("Joe", "Bloggs", 42, "brown", "English");
    console.log(joe.nationality);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-18
      • 2017-03-01
      • 2022-11-20
      • 1970-01-01
      • 1970-01-01
      • 2012-04-17
      • 2015-10-29
      • 2013-10-22
      相关资源
      最近更新 更多