背景:我最近的项目不能使用大型库,这让我很伤心。我想从任何库中获得一些东西,例如缺少的函数、、、addClass
兼容等。所以我创建了一个小对象,我想在其他时间发表一些意见,但我有一个设置它的方式有点麻烦。hasClass
removeClass
addEventListener
为了使用方便,我希望一个对象在创建时返回它自己的一个新实例。
鉴于:
$ = function() {
this.name = "levi";
return this;
};
console.log($());
我们得到 DOMWindow 而不是$
因为 JavaScript 的古怪性质this
。 对我来说更奇怪的是console.log(new $().name)
正确返回“列维”。如果this
绑定到窗口,为什么对象正确获取值?. 我们可以添加新的console.log(new $())
并且它可以工作。但是,我不想每次都写新的。所以我尝试了:
$ = function() {
var obj = function() {
this.name = "levi";
};
return new obj();
};
console.log($());
这给了我想要的东西,但是将对象包装在创建它的函数中似乎有点不必要。此外,返回的对象 isobj
和 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
它似乎在我所有的测试中都有效。