2016-05-24 8 views
3

Ist das Ersetzen des Prototyps einer integrierten Funktion illegal?

Date.prototype = { foo : 1 }; 
Date.prototype.foo // => null 

Es ist seltsam, dass ohne Fehler ausgegeben wird den Prototyp einer integrierten Funktion einfach ignoriert zu ersetzen, aber ich konnte keine Artikel, Bücher nicht finden, oder Blog-Posts es zu erwähnen.

+1

Es ist nichts illegal, obwohl Sie es vermeiden sollten. Durch das Modifizieren von integrierten Objektprototypen können Sie herausfinden, wie viele Polyfills funktionieren. –

+2

Sie können "Date.prototype" nicht neu zuweisen: http://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype, obwohl Sie das Objekt, auf das es verweist, ändern können. – 1983

Antwort

5

Nein, es ist nicht illegal (die Spezifikation hindert Sie nicht daran). Es wird normalerweise an Funktionen vorgenommen, die Sie selbst definieren.

Sie wird in den Funktionen ignoriert, die in der JavaScript-Spezifikation definiert sind, da ihre -Eigenschaft schreibgeschützt ist. Von the specification for Date.prototype:

The initial value of Date.prototype is the intrinsic object %DatePrototype% (20.3.4).

This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

(. Mein Schwerpunkt)

es Zuordnung ist nur leise in losen Modus ignoriert; im Strict-Modus (die wir alle im Grunde die ganze Zeit verwenden sollen), ist es ein Fehler:

"use strict"; 
 
Date.prototype = {};


ein wenig über die Frage gehen, können Sie Ihr eigenen definieren nur-Lese-Eigenschaften, die die gleiche Art und Weise verhalten, wenn man so will, über Object.defineProperty:

var obj = {}; 
 
Object.defineProperty(obj, "answer", { 
 
    value: 42, 
 
    writable: false // This is for emphasis, it's actually the default 
 
}); 
 
tryLoose(); 
 
tryStrict(); 
 
function tryLoose() { 
 
    console.log("Trying to assign new value in loose mode."); 
 
    obj.answer = "It's complicated."; 
 
    console.log("After assignment, obj.answer = " + obj.answer); 
 
} 
 
function tryStrict() { 
 
    "use strict"; 
 
    console.log("Trying to assign new value in strict mode."); 
 
    obj.answer = "It's complicated."; 
 
    console.log("We won't get here."); 
 
}

+0

Ja, der Prototyp ist auf eingebauten js-Objekten eingefroren (d. H. Schreibgeschützt). Sie können das überprüfen, indem Sie den Inspektor Ihres Browsers verwenden und (in Firefox) sehen, ob sich neben einer Eigenschaft ein Vorhängeschloss befindet. – tanenbring

+0

@tanenbring: Ah, ich verstehe es jetzt. Wie habe ich das Vorhängeschloss beim Lesen heute morgen vermisst? –

1

Es ist wie Russisches Roulette. Illegal? Nein. Willst du dich selbst erschießen? Könnte sein.

So ziemlich alles in Javascript besteht aus Schlüsseln und Werten, einschließlich eingebauter, die ohne Warnung oder Fehler neu zugewiesen werden können. Obwohl es wahrscheinlich unbeabsichtigte Nebenwirkungen gibt - wenn nicht in Ihrem Code, dann in einer Bibliothek, die Sie verwenden.

+0

Nun, das Beispiel des OP ('Date.prototype') kann nicht auf dem kompatiblen Browser neu zugewiesen werden, da es schreibgeschützt ist ... –

+0

Tatsächlich gibt es einige Dinge, die in Javascript wie folgt erlaubt sind. Zum Beispiel können Sie 'undefined' definieren – element11

+0

@ element11 Sie * könnte * definieren' undefined' – andlrc

0

Jede Eigenschaft eines Objekts in JavaScript hat Descriptor definiert: ist es writable, enumerable, configurable. Eigenschaft von Date Objekt ist nicht beschreibbar, daher kann der Wert nicht geändert werden.

Sie können sich selbst davon überzeugen, dass prototype von Date ist nicht beschreibbaren durch Ausführen von:

Object.getOwnPropertyDescriptor(Date, 'prototype') 

Dieses Objekt zurück, das writable Satz false hat.

Verwandte Themen