2017-09-27 44 views
0

例如不同,這裏是一個代碼段爲什麼在Javascript調用方法比調用的getter/setter方法

let myQuestion = { 
 
    _greeting: 'Hello', 
 
    
 
    sayHello() { 
 
    console.log(this._greeting); 
 
    }, 
 
    
 
    get sayHelloWithGet() { 
 
    console.log(this._greeting); 
 
    } 
 
}; 
 

 
myQuestion.sayHello(); 
 
myQuestion.sayHelloWithGet;

他們都做同樣的事情,他們兩人都是所謂的方法,但爲什麼不同的用法?

+3

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get –

+3

一個是一種方法,另一種是一個屬性訪問。它們提供了與對象交互的不同方式。 – evolutionxbox

+2

不是Javascript,但同樣的原則適用:https://stackoverflow.com/a/601648/149436 –

回答

2

...他們都被稱爲方法...

不一般。通常getter和setter被稱爲getter和setter,或者統稱爲「accessor」(但是,有時候是「accessor方法」)。

...但爲什麼不同的用法?

因爲這就是要點:有時候你想在使用點使用不同的語義,即使它在封面下運行一個函數,看起來像是一個簡單的屬性訪問。方法是動詞,非方法屬性是名詞。

(當然,掩飾一個函數調用屬性訪問時,它是在程序員責任確保讀取性能,成本低。)


依稀相關:與存取屬性是也包含在各種序列化中,而引用函數的屬性通常不是。例如:

var o = { 
 
    get foo() { 
 
    return 42; 
 
    }, 
 
    bar() { 
 
    return 67; 
 
    } 
 
}; 
 
console.log(JSON.stringify(o));

+1

好吧,我不知道什麼是「訪問器方法」之前,非常感謝你^^ –

+0

@東惠馬:很高興幫助。 FWIW,在沒有這種特殊屬性行爲的某些語言中,「訪問器方法」將是一種實際的方法。例如,在Java中,你可以將'getWhatever'和'setWhatever'作爲實際的方法。但在JavaScript,C#和其他一些應用程序中,它們可以是具有隱藏函數調用的實際屬性。 –

+0

再次^^謝謝你告訴我這一點,雖然這對我來說有點難以理解。 –

相關問題