区分具有相同名称的属性和方法

时间:2015-04-03 16:20:42

标签: javascript prototype naming

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

use strict;

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

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

    }
}

3 个答案:

答案 0 :(得分:3)

您通常不能这样做,因为方法与包含函数的属性之间的JavaScript没有区别 - 它们完全相同!您可以通过将属性分配给属性来创建方法。

这个特殊情况中,您可以通过原型访问函数对象并将其应用于对象,但这是一个可怕的黑客。

Time.prototype.format.apply(some_time_object);

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

答案 1 :(得分:1)

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

要么以不同的方式命名,方法可以是formatAs,要么使用不带参数的函数返回格式:

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

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

答案 2 :(得分:0)

函数实际上是存储在JavaScript属性中的对象,因此无法实现。

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

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