背景:私の最新のプロジェクトでは大きなライブラリを使用できません。これは悲しいことです。addClass
欠落している関数、hasClass
、removeClass
、 compatibleなど、どのライブラリからでも取得したいことがいくつかあります。そのため、別の機会に意見を求めたい小さなオブジェクトaddEventListener
を作成しましたが、私が望むように設定するのに少し苦労しました。
使いやすいように、作成時にオブジェクトがそれ自体の新しいインスタンスを返すようにします。
与えられた:
$ = function() {
this.name = "levi";
return this;
};
console.log($());
$
JavaScriptの風変わりな性質のため、代わりに DOMWindow を取得this
します。 私にとってさらに奇妙なのは、それがconsole.log(new $().name)
適切に "levi" を返すことです。がウィンドウにバインドされている場合this
、オブジェクトが適切に値を取得したのはなぜですか? . 新しいものを追加するだけconsole.log(new $())
で機能します。ただし、毎回新しいことを書きたいわけではありません。だから私は試しました:
$ = function() {
var obj = function() {
this.name = "levi";
};
return new obj();
};
console.log($());
これは私が望むものを与えてくれますが、オブジェクトを作成する関数内にオブジェクトをラップするのは少し不必要に思えます。さらに、返されるオブジェクトは is obj
and not$
です。比較テストは失敗します。
これを行うには、他にどのような方法がありますか? よりエレガントなソリューションはありますか?プロセス全体を再考することに何の不安もありません。私は 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
私のすべてのテストで機能しているようです。