class Person {
constructor(){}
set name(){
}
// delete get name() {}
}
您可以禁用屬性的getter嗎?是否有意想不到的後果?我應該拋出嗎?返回undefined?禁用ES6類中的getter?
class Person {
constructor(){}
set name(){
}
// delete get name() {}
}
您可以禁用屬性的getter嗎?是否有意想不到的後果?我應該拋出嗎?返回undefined?禁用ES6類中的getter?
如果你有你的班級,因爲你已經定義了它,那裏是沒有吸氣name
;試圖從Person
的實例讀取name
將產生undefined
(好像name
根本沒有爲該實例定義)。這由規範中的OrdinaryGet
abstract operation定義,其中說如果某個屬性是訪問者屬性,但其get
操作爲undefined
,則獲取該屬性的結果爲undefined
。 (更多關於下面的內容。)
如果你想嘗試讀取name
錯誤,那麼是的,執行getter並拋出。兩者
例子:
class NoError {
set name(value){
}
}
let n = new NoError();
console.log(n.name);
class HasError {
get name() {
throw new Error("'name' cannot be read");
}
set name(value){
}
}
let h = new HasError();
console.log(h.name);
這裏有沒有使用類一個簡單的例子:
var obj = {
set name(value) {
}
};
console.log(obj.hasOwnProperty("name")); // true
console.log(obj.name); // undefined
現在你可能在想「這就像對象沒有name
屬性,對吧?」但是,不,事實並非如此。該對象有屬性,它只是沒有getter。
如果它的行爲像它沒有屬性一樣,那麼JavaScript引擎會查看原型以找到它,從上面的spec鏈接可以看出,它並沒有:
var proto = {
name: "Name on prototype"
};
var obj = Object.create(proto, {
name: {
set(value) {
}
}
});
console.log(obj.hasOwnProperty("name")); // true
console.log(obj.name); // undefined
感謝您深思熟慮的答案。然而,我卻把JSHint錯誤與javascript錯誤混淆了。沉默警告還是用一箭之力實施它會更明智嗎? –
@MathieuBertin:這取決於你。 :-)如果你想閱讀屬性拋出,實現一個getter拋出;如果您希望它導致未定義,請將警告/錯誤消除。 –
非常感謝你:) –
我會throw
在getter中的一個異常,以避免無意的不正確使用。
沒有消氣,直到你聲明一個擺在首位?試試看:'(new Person).name'! – Bergi