【问题标题】:If I define methods on the prototype, how do I call them in the constructor?如果我在原型上定义方法,如何在构造函数中调用它们?
【发布时间】:2023-03-28 19:05:01
【问题描述】:

我知道将方法直接分配给类的原型是一种很好的做法,这样就不会在每次调用函数时都重新定义它们。

var A = function () {
    this.prop = "A property";
}
A.prototype.method = function () {
    return "A method";
}

假设我想在构造函数中调用这样定义的方法。这可能吗?

var A = function (options) {
    initialize(options); // initialize is undefined.
}
A.prototype.initialize = function (options) {
    // do something with options.
}

在构造函数中创建存根方法不起作用,因为它被调用而不是原型版本的函数。我能够让它工作的唯一方法是通过括号语法 this["initialize"]() 引用该函数,这似乎很不优雅。

var A = function (options) {
    this["initialize"](options); // function isn't defined yet but will be soon!
}
A.prototype.initialize = function (options) {
    // do something with options.
}

这看起来很笨拙,可能不是调用此函数的最佳方式。 还有其他方法还是我错过了什么?

【问题讨论】:

  • 顺便说一句,我的具体情况是我正在尝试创建一个构造函数,它接受一个选项参数并通过使用数据调用实例方法来处理选项。

标签: javascript oop class constructor


【解决方案1】:

您的最后一种方式是正确的,但您不需要引号。

var A = function (options) {
    this.initialize(options); 
};
A.prototype.initialize = function (options) {
    // do something with options.
};

假设A作为构造函数被调用,this是对正在构造的新对象的引用,并且它的原型链已经建立,所以它已经可以访问initialize方法。

当然,initialize 不需要原型。如果不打算多次调用它,那么将其定义为独立函数可能更有意义。

var A = function (options) {
    initialize(this, options); 
};
function initialize (obj, options) {
    // do something with options.
};

或者你可以把初始化代码直接放在构造函数中。

【讨论】:

  • +1 进行编辑 - 我试图想出一种方法将其放入评论中。
  • 好的。当我想到 this 如何指代新实例时,您的解释非常有道理。感觉很脏,因为我习惯于用更强类型的语言进行编码。但我想我必须克服它。
猜你喜欢
  • 2011-10-30
  • 1970-01-01
  • 2012-01-22
  • 2016-07-27
  • 2020-07-11
  • 1970-01-01
  • 2015-10-10
  • 2014-02-17
  • 1970-01-01
相关资源
最近更新 更多