Предпосылки: В моем последнем проекте не может использоваться большая библиотека, что меня огорчает. Есть несколько вещей, которые я хотел бы получить из любой библиотеки, например, отсутствующие функции 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
Похоже, оно работает во всех моих тестах.