2015-04-03 74 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