Javascript всегда поверх окна (без фокуса)

Я пришел к этому вопросу, потому что я искал способ проскочить к другому объекту, если метод не присутствовал на первом объекте. Это не так гибко, как то, о чем вы спрашиваете - например, если метод отсутствует в обоих случаях, он будет терпеть неудачу.

Я думал об этом для небольшой библиотеки, которую у меня есть, что помогает настраивать объекты 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 там где-нибудь, но кажется, что это не нужно.

0
задан RichardJN 18 March 2019 в 00:08
поделиться

1 ответ

Установите для свойства z-index компонента, который всегда находится сверху, более высокое значение, чем для любого другого элемента страницы.

0
ответ дан chris.va.rao 18 March 2019 в 00:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: