Предыстория: Мой последний проект не может использовать большую библиотеку, что меня огорчает. Есть несколько вещей, которые я хотел бы получить из любой библиотеки, такие как отсутствующие функции addClass
, hasClass
, removeClass
, совместимый addEventListener
и т.д. Поэтому я создал небольшой объект, который хотел бы получить некоторые мнения в другое время, но я У меня есть небольшие проблемы с настройкой, как я хотел бы.
Для удобства использования я хочу, чтобы объект возвращал новый экземпляр самого себя при создании.
Дано:
$ = function() {
this.name = "levi";
return this;
};
console.log($());
Мы получаем DOMWindow вместо $
из-за необычной природы this
в JavaScript. Что более странно для меня, это то, что console.log(new $().name)
Name console.log(new $().name)
правильно возвращает "levi". Если this
связано с окном, почему объект правильно получил значение? Мы могли бы просто добавить новый 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 : '') + "<br/>");
};
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
Кажется, он работает во всех моих тестах.