Sì, in javascript. Questo perché in javascript i metodi sono funzioni e le funzioni sono oggetti a tutti gli effetti.
Esempio:
// Here's a "class" with method foo.
// Note that javascript don't really have classes,
// we use constructors instead:
function FooTeNator () {
this.text = "foo";
}
FooTeNator.prototype.foo = function () {return this.text}
Nota la prima cosa interessante: i metodi sono solo funzioni di prima classe assegnate al prototipo del nostro costruttore.
Chiamata al metodo normale:
var foomatic = new FooTeNator();
foomatic.foo(); // returns "foo"
Ridefinire un nuovo metodo dopo aver creato l'oggetto:
var foomatic = new FooTeNator();
foomatic.foo = function () { return "" }
foomatic.foo(); // returns empty string
Lasciando che un altro oggetto prenda in prestito il nostro metodo:
var foomatic = new FooTeNator();
var other_object = {}; // {} is a plain object in object literal syntax
other_object.text = "bar";
other_object.foo = foomatic.foo;
other_object.foo(); // returns "bar"
Lasciando che un altro oggetto prenda in prestito il nostro metodo dal nostro costruttore:
var other_object = {text : "bar"};
other_object.foo = FooTeNator.prototype.foo;
other_object.foo(); // returns "bar"
Chiamando il nostro metodo mentre riassegniamo temporaneamente il valore di this
al suo interno a un altro oggetto:
var foomatic = new FooTeNator();
var other_object = {text : "bar"};
foomatic.foo.call(other_object); // returns "bar"
Penso che si qualifichi come metodo di prima classe. Certo, questa è solo una funzione di prima classe. Ma per quanto riguarda la funzione OO, la funzione non è una funzione regolare perché in essa viene indicato this
.
Nota a margine:
Javascript ha uno strano concetto di this
. Anche le funzioni regolari possono fare riferimento a this
al di fuori degli oggetti. Quando non è associato a nessun oggetto, javascript associa this
all'ambito globale o all'oggetto DOM o indefinito a seconda delle circostanze.
Lato, nota a margine:
Quando ho detto che le funzioni sono oggetti in javascript significa davvero cosa significa. Le funzioni (quindi i metodi) hanno un costruttore, la funzione Function
. Anche le funzioni / i metodi possono avere metodi:
// Creating a method using the Function constructor
var my_object = {
strange_method : new Function('x','return x');
}
// Assigning a method to our method:
my_object.strange_method.sub_method = function () {return 'HA!'};