Llegué a esta pregunta porque estaba buscando una manera de pasar a otro objeto si el método no estaba presente en el primer objeto. No es tan flexible como lo que preguntas; por ejemplo, si falta un método en ambos, se producirá un error.
Estaba pensando en hacer esto para una pequeña biblioteca que tengo que ayuda a configurar los objetos extjs de una manera que también los hace más comprobables. Tenía llamadas separadas para conseguir realmente el asimiento de los objetos de interacción y que esto podría ser una buena manera de pegarse esas llamadas juntas devolviendo efectivamente un tipo aumentada
me ocurren dos maneras de hacer esto:
Prototipos
Puede hacer esto usando prototipos, ya que las cosas caen en el prototipo si no están en el objeto real. Parece que esto no funcionaría si el conjunto de funciones que desea utilizar utiliza la palabra clave this: obviamente su objeto no sabrá o no le importará lo que el otro conoce.
Si todo es su propio código y no está usando esto y constructores ... que es una buena idea por muchas razones, entonces puede hacerlo de esta manera:
var makeHorse = function() {
var neigh = "neigh";
return {
doTheNoise: function() {
return neigh + " is all im saying"
},
setNeigh: function (newNoise) {
neigh = newNoise;
}
}
};
var createSomething = function (fallThrough) {
var constructor = function() {};
constructor.prototype = fallThrough;
var instance = new constructor();
instance.someMethod = function() {
console.log("aaaaa");
};
instance.callTheOther = function() {
var theNoise = instance.doTheNoise();
console.log(theNoise);
};
return instance;
};
var firstHorse = makeHorse();
var secondHorse = makeHorse();
secondHorse.setNeigh("mooo");
var firstWrapper = createSomething(firstHorse);
var secondWrapper = createSomething(secondHorse);
var nothingWrapper = createSomething();
firstWrapper.someMethod();
firstWrapper.callTheOther();
console.log(firstWrapper.doTheNoise());
secondWrapper.someMethod();
secondWrapper.callTheOther();
console.log(secondWrapper.doTheNoise());
nothingWrapper.someMethod();
//this call fails as we dont have this method on the fall through object (which is undefined)
console.log(nothingWrapper.doTheNoise());
Esto no lo hace trabajo para mi caso de uso ya que los chicos de extjs no solo han usado erróneamente 'esto', sino que también han construido un sistema completo de tipo de herencia clásica loca sobre el principio del uso de prototipos y 'esto'.
Esta es realmente la primera vez que uso prototipos/constructores y estaba un poco desconcertado porque no puedes simplemente configurar el prototipo, también tienes que usar un constructor. Hay un campo mágico en los objetos (al menos en Firefox) llamado __proto que es básicamente el prototipo real. parece que el campo del prototipo real solo se usa en el momento de la construcción ... ¡qué confuso!
métodos de copia
Este método es probablemente más caro, pero parece más elegante para mí y también trabajará en el código que está utilizando this
(por ejemplo, para que pueda usarlo para envolver objetos de la biblioteca). También funcionará en cosas escritas usando el estilo funcional/de cierre también. Lo acabo de ilustrar con this/constructors para mostrar que funciona con cosas como esa.
aquí está el mods:
//this is now a constructor
var MakeHorse = function() {
this.neigh = "neigh";
};
MakeHorse.prototype.doTheNoise = function() {
return this.neigh + " is all im saying"
};
MakeHorse.prototype.setNeigh = function (newNoise) {
this.neigh = newNoise;
};
var createSomething = function (fallThrough) {
var instance = {
someMethod : function() {
console.log("aaaaa");
},
callTheOther : function() {
//note this has had to change to directly call the fallThrough object
var theNoise = fallThrough.doTheNoise();
console.log(theNoise);
}
};
//copy stuff over but not if it already exists
for (var propertyName in fallThrough)
if (!instance.hasOwnProperty(propertyName))
instance[propertyName] = fallThrough[propertyName];
return instance;
};
var firstHorse = new MakeHorse();
var secondHorse = new MakeHorse();
secondHorse.setNeigh("mooo");
var firstWrapper = createSomething(firstHorse);
var secondWrapper = createSomething(secondHorse);
var nothingWrapper = createSomething();
firstWrapper.someMethod();
firstWrapper.callTheOther();
console.log(firstWrapper.doTheNoise());
secondWrapper.someMethod();
secondWrapper.callTheOther();
console.log(secondWrapper.doTheNoise());
nothingWrapper.someMethod();
//this call fails as we dont have this method on the fall through object (which is undefined)
console.log(nothingWrapper.doTheNoise());
realidad estaba anticipando tener que utilizar bind
en alguna parte, pero no parece ser necesario.
No estoy seguro de si se refiere a prototipos de funciones, en cuyo caso ¿puede ser útil? https: //developer.mozilla.org/es/JavaScript/Reference/Global_Objects/Function Para ser sincero, no tengo idea si esa referencia es útil. Solo he visto prototipos de funciones en C++ – Joel
posible duplicado de [¿Falta el método de captura en Javascript y algo de lógica?] (http://stackoverflow.com/questions/8283362/capture-method-missing-in-javascript-and-do-some-logic) –