Was es tut, ist zu sehen, ob dieser Eigenschaftsname in einem leeren Objekt existiert. Zum Beispiel filtert es toString
heraus (auf Implementierungen, die über toString
und in
nicht buggy sind; IE ist).
Es kann ein Versuch sein, um Leute zu arbeiten, die Sachen zum Object.prototype
hinzufügen (was eine sehr, sehr schlechte Idee ist). Zum Beispiel:
Object.prototype.foo = "bar"; // <== VERY BAD IDEA
alert({}.foo); // alerts "bar"
function Thingy(a, b) {
this.a = a;
this.b = b;
}
Thingy.prototype.x = 42;
var t = new Thingy(1, 2);
Wenn ich will t
kopieren, einschließlich der vererbten x
Eigentum von Thingy
aber nicht einschließlich der foo
Eigenschaft es von Object
erbt, könnte ich das if (name in {})
verwenden diejenigen zu überspringen.
Wohlgemerkt, es ist nicht eine sehr intelligente Art und Weise, das zu tun, da es wird scheitern, wenn ich dies tun:
var t = new Thingy(1, 2);
t.foo = "charlie";
Jetzt t
hat seine eigenefoo
, die vermutlich hätte ich gewünscht haben zu kopieren .
würde eine genauere Überprüfung sein: nur diejenigen herauszufiltern
dest = {};
blank = {}; // No need to recreate it on every iteration
for (name in src) {
if (src.hasOwnProperty(name) || !(name in blank)) {
dest[name] = src[name];
}
}
Das wird die vererbt werden, oder zumindest könnte, von Object
vererbt werden. Aber selbst das ist fehlerhaft; Was passiert, wenn es einen Wert für die Eigenschaft erbt, aber nicht den Wert von Object
(z. B. etwas in der Mitte — Thingy
vielleicht — hat Object
's Standard überschrieben)?
Sie können also diesen Code, den Sie geerbt haben, wahrscheinlich umgestalten, wahrscheinlich in Bezug auf die Verwendung von hasOwnProperty
und sicherstellen, dass nichts in Ihrer Anwendung Dinge auf Object.prototype
setzt.
Es ist eine gute Frage. Warum wurde das abgelehnt? –