Ich sehe von meiner Konsole aus, dass Datum eine Funktion ist (typeof Date zeigt Funktion). Und Date.now ist eine Funktion.

Ich bin mir bewusst, dass eine Funktion Date () darin enthalten sein könnte var now=function...., aber dann wäre now von außen nicht zugänglich, sondern nur lokal. Und es könnte this.now sagen, aber jetzt würde es nur existieren, wenn Date () mit new aufgerufen wird. Ich kann sehen, dass typeof Date eine Zeichenfolge ist und typeof new Date () ein Objekt ist. Also Date ist eine Funktion. Also kann ich nicht sehen, wie es ist, dass ich Date.now machen kann

Ich sehe 'jetzt' auf mdn für das Date-Objekt aufgelistet, aber ich sehe nicht, wo es im nativen Code platziert werden würde, z. Wenn man ein Objekt Blah schreiben würde, mit einer Funktion, die mit Blah.func aufgerufen wird, wo würden wir die Definition von func platzieren?

-2
barlop 20 Aug. 2015 im 18:42

4 Antworten

Beste Antwort

Eine Funktion ist auch ein Objekt, daher kann sie wie jedes andere Objekt Eigenschaften haben, und eine Eigenschaft kann eine Funktion als Wert haben.

Die Eigenschaft now befindet sich nicht in der Funktion, sondern ist an das Funktionsobjekt angehängt. Wenn Sie das im Code wiederholen würden, würden Sie verwenden:

function Date() {
  // some code
}

Date.now = function(){
  // some code
};
2
Guffa 20 Aug. 2015 im 15:47

now ist eine Methode für das Date -Objekt, die zufällig eine Funktion ist, aber Funktionsobjekte können wie andere Objekte Eigenschaften haben.

1
user663031user663031 20 Aug. 2015 im 15:45

Funktion ist ein Objekt

Typeof function () {} sagt "function", obwohl function ein Objekt ist

(function(){}) instanceof Object <- gibt true zurück

Man kann also sagen, dass es außerhalb der Date-Konstruktorfunktion eine Zeile mit Date.now = function () {...} gibt.

Dadurch wird dem Date-Funktionsobjekt eine Eigenschaft zugewiesen.

Es ist ein bisschen wie Java statisch. Aber es ist anders, weil Javascript keine Klassen hat und tatsächlich zum Date-Objekt gehört. Date ist eine Instanz von Object. Es ist auch ganz anders als in Java, da die Instanzen von Date nur dann auf die Eigenschaft zugreifen können, wenn sie Date.xyz ausführen. Da Sie sich im Fensterobjekt befinden, können Sie xyz nicht erstellen, indem Sie einfach var xyz = function () {eingeben ..} du musst Date.now=function(){..} tun

HINZUGEFÜGT

Genauer ist es, wenn die Funktion einen Namen hat, da Date.now function now() zurückgibt. Anstelle von Date.now=function(){...} wäre es also genauer, Date.now=function now(){...} zu sagen, aber man kann genauer sein als Das..

Da auch

(basierend auf einer von Torazaburo erwähnten Idee)

Torazaburo weist darauf hin, dass die now Funktion von Date nicht aufzählbar ist. Ich nehme an, man würde es mit Object.defineProperty so definieren.

Object.defineProperty(Date,'noww',{enumerable:false, value:function noww(){}})<ENTER>

Dadurch wird die Eigenschaft mit dem Wert erstellt.

Wenn eine Eigenschaft aufzählbar ist, müssen Sie sie mit dem dortigen Wert erstellen, anstatt sie später zuzuweisen. (Der Versuch, einer Aufzählung zuzuweisen: false-Eigenschaft gibt nur undefiniert.

Jetzt haben wir die noww-Funktion sehr ähnlich wie Date erstellt (obwohl kein Körper die Funktionalität innerhalb der Funktion nicht wirklich in Frage stellte).

Date.noww<ENTER> 
function noww()  <--- like if I'd entered Date.now<ENTER>

Date.propertyIsEnumerable('noww');
false  <-- like if i'd entered Date.propertyisEnumerable('now')

Date.propertyIsEnumerable('now');
false

Date.hasOwnProperty('now');
true

Date.hasOwnProperty('noww');
true
0
barlop 22 Aug. 2015 im 09:59

Ich denke, @ Guffas Antwort ist richtig, aber ich möchte ein anderes Beispiel geben.

Wenn ich dich richtig verstanden habe, fragst du nach dem nächsten Verhalten:

var blah = function() {

};

blah.now = function() {
    new Date();
};

Prüftypen:

console.log(typeof blah);     // function
console.log(typeof blah.now); // function
1
Maxim Zhukov 20 Aug. 2015 im 15:49