2017-01-28 1 views
3

iWie können wir beweisen, dass JavaScript-Funktionen Objekte sind?

bin mit
var foo = function(){} 

typeof(foo) - kehrt Funktion anstelle von Object

während JavaScript-Konzept sagen, dass alle Funktionen in JavaScript-Objekte sind?

+0

Die Tatsache, dass sie als Ausdruck erstellt werden und dass sie zugewiesen werden können, verglichen (durch Verweis) und dass Sie beliebige Eigenschaften hinzufügen können, sollte ausreichen, nein? – Lucero

Antwort

1

Wie wäre es damit für einen Test

> x = function(){} 
<- function(){} 
> x.a = "Asd" 
<- "Asd" 
> x 
<- function(){} 
> x.a 
<- "Asd" 

gleich auf einer ganzen Zahl Dadurch wird in undefinierte Zuordnung führen

> x = 1 
<- 1 
> x.a = 123 
<- 123 
> x 
<- 1 
> x.a 
<- undefined 
6

In erster Linie ist es die Tatsache, dass die Spezifikation ausdrücklich darauf hin, sie sind Objekte, in vielen Orten, einschließlich here, wo es den Begriff "Funktion" definiert:

Funktion

Mitglied der Objekttyp, der als Unterprogramm

Empirisch geltend gemacht werden kann, gibt es viele Möglichkeiten, es zu beweisen, aber eine der einfachsten ist es, ein Wert einer Eigenschaft zuweisen auf es:

var foo = function() { }; 
 
foo.myProperty = "my value"; 
 
console.log(foo.myProperty); // "my value"

Oder man als Prototyp verwenden (was ungewöhnlich ist, aber möglich), die sie als nur Objekte beweist können Prototypen sein:

var foo = function() { }; 
 
var obj = Object.create(foo); 
 
console.log(Object.getPrototypeOf(obj) === foo); // true

1

Sie diese einfach sehr beweisen können :

console.log(Object.getPrototypeOf(Function.prototype)); 
 
console.log(Object.prototype === Object.getPrototypeOf(Function.prototype)); 
 

 
// or, being evil 
 
Object.prototype.testFn =() => console.log('Exists on all objects'); 
 
({}).testFn(); 
 
[].testFn(); 
 
(new Number(5)).testFn(); 
 
Math.sqrt.testFn();
Die ersten beiden Zeilen zeigen, dass der nächste Schritt in der Prototypkette über Function.prototype hinaus Object.prototype ist.

Die anderen Zeilen zeigen, dass Sie Object.prototype (ernsthaft tun dies nie) eine Eigenschaft hinzufügen können, und es existiert für alle Objekte.In diesem Fall testen wir es an einem leeren Objekt, einem leeren Array, einem Number Objekt und an der Math.sqrt Funktion. Durch Hinzufügen einer Eigenschaft (in diesem Fall eine Funktion) zu Object.prototype erhalten alle anderen die Eigenschaft ebenfalls.

0

console.log (Funktion.prototyp instanceof Object);

Verwandte Themen