ejemplos - ¿Puede el constructor de JavaScript devolver la función y mantener la herencia?
prototype javascript ejemplos (4)
En usted, su ejemplo F no es un constructor, es una función que devuelve un constructor anónimo al que llamará new. instanceof funciona al observar la cadena de prototipos, por lo que su código no funciona porque no ha configurado los prototipos correctamente.
Esta página tiene una buena explicación de los constructores de JavaScript y de la clase secundaria.
Eche un vistazo al siguiente código y vea si ayuda.
function F() {
this.whoami = ''F'';
this.whatami = ''F'';
}
function Sub() {
this.whoami = ''G'';
}
Sub.prototype = new F();
function G() {
return new Sub;
}
var f = new G();
console.log(f instanceof F); // returns false
console.log(f.whoami);
console.log(f.whatami);
function F() {
return function() {
return {};
}
}
var f = new F();
f instanceof F; // returns false
Por lo que yo entiendo, si quiero que instanceof
funcione, necesito devolver this
desde el constructor. Pero quiero que el constructor devuelva una función, y no puedo asignar this
.
Entonces, ¿esto es realmente imposible o se puede hacer de alguna manera, para f = new F()
para devolver una función y aún f instanceof F
para volver verdadero?
Por supuesto, puede hacer que todas las funciones parezcan instanceof F
configurando F.prototype = Function.prototype;
.
Desafortunadamente, parece que ECMAScript no permite crear una subclase de funciones.
Sin embargo, puede hacerlo en Gecko utilizando la propiedad __proto__
obsoleta:
function F() {
function f() {
return {};
}
f.__proto__ = F.prototype;
return f;
}
F.prototype.__proto__ = F.__proto__;
function F() {
var r = function() {
return {};
};
r.__proto__ = this.__proto__;
return r;
}
var f = new F();
f instanceof F;
true
f();
Object
Solo funciona en los navegadores con __proto__
Para cualquier persona que se encuentre con esto hoy, con ES6 / 2015 hay una nueva sintaxis que puede usar para evitar la propiedad __proto__
desuso; Object.setPrototypeOf
. Tenga en cuenta que MDN advierte que esta es una operación lenta / costosa.
function F() {
const f = function() {
return {};
}
Object.setPrototypeOf(f, F.prototype);
return f;
}
var f = new F();
f instanceof F; // returns true
f(); // returns {}
Tenga en cuenta también que se pone un poco raro si quiere inicializar valores en el constructor. Debes configurarlos como accesorios en la función que devolverás, pero las adiciones posteriores al prototipo los referirán como ''esto''. p.ej
function F() {
const f = function() {
return {};
}
f.favoriteBand = ''The Books'';
Object.setPrototypeOf(f, F.prototype);
return f;
}
F.prototype.getFavoriteBand = function(){ return this.favoriteBand; }
var f = new F();
f.getFavoriteBand() // returns ''The Books''