2016-12-01 47 views
1
class Person { 
    constructor(){} 

    set name(){ 

    } 

    // delete get name() {} 
} 

您可以禁用屬性的getter嗎?是否有意想不到的後果?我應該拋出嗎?返回undefined?禁用ES6類中的getter?

+0

沒有消氣,直到你聲明一個擺在首位?試試看:'(new Person).name'! – Bergi

回答

2

如果你有你的班級,因爲你已經定義了它,那裏沒有吸氣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

+0

感謝您深思熟慮的答案。然而,我卻把JSHint錯誤與javascript錯誤混淆了。沉默警告還是用一箭之力實施它會更明智嗎? –

+0

@MathieuBertin:這取決於你。 :-)如果你想閱讀屬性拋出,實現一個getter拋出;如果您希望它導致未定義,請將警告/錯誤消除。 –

+0

非常感謝你:) –

0

我會throw在getter中的一個異常,以避免無意的不正確使用。