Объект, который возвращает экземпляр самого себя

Предпосылки: В моем последнем проекте не может использоваться большая библиотека, что меня огорчает. Есть несколько вещей, которые я хотел бы получить из любой библиотеки, например, отсутствующие функции addClass , hasClass , removeClass , совместимые addEventListener ] и т. д. Итак, я создал небольшой объект , о котором мне хотелось бы высказать свое мнение в другой раз, но у меня возникли небольшие проблемы с настройкой его так, как мне хотелось бы.

Для удобства использования я хочу, чтобы объект возвращал новый экземпляр самого себя при создании.

Дано:

 $ = function() {
    this.name = "levi";

    return this;
};

console.log($());

Мы получаем DOMWindow вместо $ из-за необычной природы this в JavaScript. Что более странно для меня, так это то, что console.log (new $ (). Name) правильно возвращает «levi». Если этот привязан к окну, почему объект правильно получил значение? . Мы могли бы просто добавить новый console.log (new $ ()) , и он работает. Однако я не хочу каждый раз писать что-то новое. Итак, я попробовал:

$ = function() {
    var obj = function() {
        this.name = "levi";
    };

    return new obj();
};

console.log($());

Это дает мне то, что я хочу, но кажется немного ненужным заключать объект внутрь функции, которая его создает. Более того, возвращаемый объект - obj , а не $ . Сравнительные тесты не пройдут.

Как еще можно это сделать? Есть ли более элегантное решение? Я без колебаний переосмыслил весь свой процесс. Я считаю, что неплохо умею использовать JavaScript, но создание нового JavaScript - это то, в чем я новичок.


Кто-нибудь видит что-нибудь неправильное в следующем решении?

$a = function() {};

$ = function() {
    if (!(this instanceof $)) {
        return new $();
    }

    this.name = "levi";

    return this;
};

//helper function
var log = function(message) {
    document.write((message ? message : '') + "
"); }; log("$().name == window.name: " + ($().name == window.name)); //false log("$().name: " + $().name); //levi log("window.name: " + window.name); //result log(); log("$a instanceof $: " + ($a instanceof $)); //false log("typeof $a: " + (typeof $a)); //function log("typeof $: " + (typeof $)); //function

Похоже, оно работает во всех моих тестах.

11
задан Robert Harvey 18 December 2018 в 21:05
поделиться