https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function
Warum ich die nicht mit for (i in Function) durchlaufen kann, kapiere ich grade nicht.
http://es5.github.io/ Suche nach [[Enumerable]]
http://es5.github.io/#x8.6.1
Testen mit:
$ Function.prototype.propertyIsEnumerable('bind')
false
$ Object.getOwnPropertyDescriptor(Function.prototype, 'bind')
Object {value: function, writable: true, enumerable: false, configurable: true}
Hier zeigt sich, dass die Eigenschaft nicht enumerable ist.
Test = function () {
this.a = "b";
}
MyTest = new Test();
console.log(typeof Test); //function
console.log(typeof MyTest); //object
Was daran liegt, dass der typeof-Operator ziemlich kaputt ist. Das sagt nicht aus, dass Funktionen keine Objekte sind… typeof gibt immer 'object' zurück, wenn es sich nicht um einen Primitive, eine Funktion oder undefined handelt.
> ~~~javascript
Test = function () {
> this.a = "b";
> }
> Test.b = "c";
> MyTest = new Test();
> console.log(MyTest.b); // undefined
> console.log(Test.b); // c
>
MyTest erbt natürlich nicht Eigenschaften ihres Konstruktors (Test), sondern nur die ihres Prototyps (Test.prototype).
var instanz = new Konstruktor();
// Eigene oder prototypisch vererbte Eigenschaft:
console.log(instanz.eigenschaft);
// Eigenschaft des Konstruktors, dasselbe wie Konstruktor.eigenschaft:
console.log(instanz.constructor.eigenschaft);
Aber was "habe" ich davon, dass meine Funktion Test noch die Eigenschaft b mit sich bringt, also fürs praktische Programmieren?
Solche »statischen Klassenmethoden« nutzt man in Javascript genauso wie in anderen Sprachen.
var User = function(attributes) {…};
User.from = function (json) {
var obj = JSON.parse(json);
return new User(obj);
};
Oder um Konstanten unterzubringen:
User.USER_ROLE = 0;
User.MODERATOR_ROLE = 1;
User.ADMIN_ROLE = 2;
(aus den Fingern gesaugt)
Mathias