区分 属性 和同名方法

Differentiate between property and method with same name

如果我有一个名为 format 的变量和一个同名的方法,我将如何调用变量和方法?

use strict;

function Time() {
    this.format = 'x:y:z';
}

Time.prototype = {
    format: function (format) {

    }
}

您通常不能这样做,因为 方法 和包含 属性 的 JavaScript 没有区别a function——它们是完全一样的东西!您可以通过将函数分配给属性来创建方法。

这种特殊情况中,您可以通过原型访问函数对象并将其应用于对象,但这是糟糕的 hack.

Time.prototype.format.apply(some_time_object);

最好将方法和值存储在不同名称的属性中。

函数实际上是存储在 JavaScript 属性中的对象,所以这是不可能的。

当您调用 instance.format() 时,解释器会查看实例以查看它是否有一个名为 format 的 属性。如果有,它会检查它是否是一个函数,如果不是则抛出错误。如果实例没有这样的 属性,它会检查实例的原型并做同样的事情,直到祖先有 format 属性 或直到它到达继承的顶部树。在你的情况下,它总是会尝试执行字符串,这会导致错误。解释器从不查看其 format() 方法的原型。

如果您愿意,可以将 属性 重命名为 formatStringmask

你不能这样做。唯一保留的 属性 将是字符串,该函数将不存在于任何实例化对象中。

要么以不同的方式命名它们,方法可以是 formatAs,或者具有不带参数的函数 return 格式:

function Time() {
  this.currentformat = 'x:y:z';
}

Time.prototype.format = function (format) {
  if (typeof format === "undefined"){
    return this.currentformat;
  }
  // ...
}