Nie jest to zalecane i nigdy nie jest dobrym pomysłem rozszerzanie wbudowanych klas. Zamiast tego, lepiej tworzyć własne implementacje wbudowanych klas, podobnie jak robi to biblioteka YUI (YArray, itp.). Ja jednak zamierzam zaprzeczać, bo ja często stwierdzają, że wdrażanie użytecznych skróty takie jak ten są korzyści do pisania czystego kodu w utrzymaniu:
if (undefined === Object.prototype.setdefault) {
Object.prototype.setdefault = function(key, def) {
if (! this.hasOwnProperty(key)) {
this[key] = def;
}
return this[key];
};
}
więc zobaczymy go w akcji ...
var a = {};
a.setdefault('mylist', []).push(1);
a.setdefault('mylist', []).push(2);
console.log(a.mylist.toString());
1,2
Jak już wspomniano, nigdy nie warto używać thing = thing || defaultThing
, ponieważ testuje tylko nierównomierną liczbę równą true
lub thing == true
. W przeciwieństwie do wpisanej równości: thing === true
lub thing !== undefined
. Więc jedynym sposobem, aby poprawnie kod setdefault
w sposób inline byłoby wykorzystać ten fragment wszędzie:
/* null == thing is equivalent to... */
if (undefined !== thing && null !== thing) {
thing = defaultThing;
}
/* ...but it's not explicit and linters don't like it! */
Ale jak już mówiłem, to tylko dodaje uwędzić do kodu i jest podatny na błędy nabytych od „przed kopiowaniem i wklej "syndrom".
Lepszym testem dla niezdefiniowanych w JavaScript jest 'typeof (a [key]) ===" undefined "' i to się nie powiedzie, jeśli chcesz, aby wartości 'null' były puste, co wymaga dodatkowego testu' a [ klucz] == null'. Ponieważ Javascript jest językiem prawdy, zarówno 'undefined' i' null' są fałszywe, a zatem prosty 'a [klucz] || (a [klucz] = wartość) 'jest wszystkim, co jest niezbędne do tego celu i jest dość powszechne w praktyce. –
@ptomato tak, masz rację, sprawdź zaktualizowaną odpowiedź. – stackoverflowery