Я пришел к этому вопросу, потому что я искал способ проскочить к другому объекту, если метод не присутствовал на первом объекте. Это не так гибко, как то, о чем вы спрашиваете - например, если метод отсутствует в обоих случаях, он будет терпеть неудачу.
Я думал об этом для небольшой библиотеки, которую у меня есть, что помогает настраивать объекты extjs таким образом, что также делает их более проверяемыми. У меня были отдельные вызовы, чтобы на самом деле получить объекты для взаимодействия, и подумал, что это может быть хорошим способом соединить эти вызовы, эффективно возвращая расширенный тип
. Я могу представить два способа сделать это:
Прототипы
Вы можете сделать это с помощью прототипов - поскольку материал попадает в прототип, если он не находится на самом объекте. Похоже, что это не сработает, если набор функций, которые вы хотите использовать, чтобы использовать это ключевое слово - очевидно, ваш объект не знает и не заботится о вещах, о которых знает другой.
Если все ваши собственный код, и вы не используете это и конструкторы ... что является хорошей идеей по многим причинам, тогда вы можете сделать это следующим образом:
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());
Это не работает для моего варианта использования поскольку ребята из extjs не только ошибочно использовали «это», они также создали целую сумасшедшую систему классического типа наследования в отношении принципа использования прототипов и «этого».
Это на самом деле первый раз, вы использовали прототипы / конструкторы, и я был немного озадачен тем, что вы не можете просто установить прототип - вам также придется использовать конструктор. Существует волшебное поле в объектах (по крайней мере, в firefox) вызывает __proto, который в основном является настоящим прототипом. кажется, что фактическое поле прототипа используется только во время построения ... как запутанно!
Методы копирования
Этот метод, вероятно, дороже, но кажется более изящным для меня и также будет работать с кодом, использующим this
(например, чтобы вы могли использовать его для обтекания объектов библиотеки). Кроме того, он будет работать и над материалами, написанными с использованием функционального / закрывающего стиля. Я просто проиллюстрировал это с помощью этих / конструкторов, чтобы показать, что он работает с такими вещами.
Вот моды:
//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());
Я действительно ожидал, что нужно использовать bind
там где-нибудь, но кажется, что это не нужно.
Установите для свойства z-index компонента, который всегда находится сверху, более высокое значение, чем для любого другого элемента страницы.