【问题标题】:Access constructor properties outside the constructor访问构造函数之外的构造函数属性
【发布时间】:2023-04-02 08:30:01
【问题描述】:

假设我有这个构造函数:

function Person() {
  this.name = 'jviotti';
}

如何从构造函数外部访问this.name 的值,例如将其设置为另一个值?

Person.name
// Person

Person.constructor.name
// Function

【问题讨论】:

  • 为什么?这样做的目的是什么?
  • 在实例化之前从第三方库自定义构造函数
  • 你不能。它不是一个属性,它只是一行 Javascript 代码。如果你希望你的类有可配置的默认值,你应该把它们放在一个可访问的对象中,而不是硬编码它们。
  • 看看jQuery.ajaxSetup()如何将默认值配置为jQuery.ajax()

标签: javascript


【解决方案1】:

es6中,如果你使用class然后创建一个class的实例和instance.property,你会得到答案

class Example {
  constructor(size) {
    this.size = size;
  }
}

$ var example = new Example(5);
$ example.size; // 5

【讨论】:

    【解决方案2】:

    您可以通过从“子类化”它的对象继承来覆盖属性:

    var inherits = function(childCtor, parentCtor) {
      function tempCtor() {};
      tempCtor.prototype = parentCtor.prototype;
      childCtor.superClass_ = parentCtor.prototype;
      childCtor.prototype = new tempCtor();
      childCtor.prototype.constructor = childCtor;
    };
    function Person() {
      this.name = 'jviotti';
    }
    Person.prototype.getName=function(){
      return this.name;
    }
    function myPerson(){
      Person.call(this);
      // overriding default value for name
      this.name="my person's name";
    }
    inherits(myPerson,Person);
    // override getName and calling it's parent
    myPerson.prototype.getName=function(){
      return "From myPerson:" + myPerson.superClass_
        .getName.call(this);
    }
    var p = new myPerson();
    console.log(p.getName());//From myPerson:my person's name
    

    不确定这是否是您想要做的。在您的示例中,属性 name 是一个实例属性。因此,您可以通过“子类化”Person 来更改它的默认值。原型属性和方法由所有实例共享,可用于对象的默认值和方法。

    代码显示了如何通过定义myPerson 来更改这些属性,该myPerson 的行为类似于Person,但会覆盖为name 设置默认值并添加实现getName

    【讨论】:

      【解决方案3】:

      取决于你想怎么称呼它。如果您使用的是原型,那么:

      function Person(){
        this.name="John"
      }
      
      function Person(){} //re-defining the constructor
      Person.prototype.name = "Jane"; //changing the constructor
      var person = new Person();
      console.log("person.name") //"Jane"
      

      【讨论】:

        【解决方案4】:

        您需要创建该对象的实例。

        function Person() {
          this.name = 'jviotti';
        }
        
        var person1 = new Person();
        console.log(person1.name); // jviotti
        
        person1.name = 'ctcherry';
        console.log(person1.name); // ctcherry
        

        【讨论】:

        • 是的,但是如果我想在实例化之前编辑构造函数属性怎么办?
        • 你不能编辑它所在的构造函数。但是您可以从中继承,请参阅此答案以获取更多信息:stackoverflow.com/questions/9267157/…
        猜你喜欢
        • 1970-01-01
        • 2012-07-06
        • 1970-01-01
        • 1970-01-01
        • 2012-12-25
        • 1970-01-01
        • 2016-08-06
        • 2019-07-16
        • 2018-02-20
        相关资源
        最近更新 更多