2015-04-03 65 views
1

如果我有一个名为format的变量和名称相同的方法,我该如何去调用变量和方法?区分属性和方法同名

use strict; 

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

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

    } 
} 
+0

你不能 - 他们的名字不同 – Igor 2015-04-03 16:23:20

+0

不可能。该方法被覆盖。 – theonlygusti 2015-04-03 16:24:28

+0

更好的问题将是你解释*为什么你需要这种行为。你当然可以*错误地编写代码,干扰自己的代码,但你为什么会这样做?代码简单写入失败。 – user1596138 2015-04-03 16:41:35

回答

3

您通常不能做到这一点,因为有一个方法和包含的功能一个属性之间在JavaScript中没有什么区别 - 它们是完全一样的东西!您可以通过将属性分配给功能来创建方法。

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

Time.prototype.format.apply(some_time_object); 

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

0

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

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

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

1

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

无论是不同的他们的名字,该方法可以formatAs,或者有一个函数不带参数返回格式:

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

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

我喜欢getter-setter函数的思想,如果没有参数,它会得到这个值,如果有的话就设置它,但在这种情况下,我认为他的format()函数根据所述格式返回时间,所以它不能作为一个getter。 – 2015-04-03 16:32:34

+0

@JacqueGoupil是的,它可以。为什么不? – theonlygusti 2015-04-03 16:42:50

+1

我认为'instance.format()'应该返回'12:56:01',所以它不能返回'x:y:z'。但是我可能会误解他想要做的事情。 – 2015-04-03 16:57:33