【发布时间】:2011-05-21 22:34:13
【问题描述】:
背景:我最近的项目不能使用大型库,这让我很伤心。我想从任何库中获得一些东西,例如缺少的函数addClass、hasClass、removeClass、兼容的addEventListener 等。所以我创建了a little object,我想要一些其他时间的意见,但我在设置它时遇到了一些麻烦。
为了使用方便,我希望一个对象在创建时返回它自己的一个新实例。
给定:
$ = function() {
this.name = "levi";
return this;
};
console.log($());
由于 JavaScript 中 this 的古怪性质,我们得到 DOMWindow 而不是 $。 对我来说更奇怪的是console.log(new $().name) 正确返回“levi”。如果this 绑定到window,为什么对象正确获取了值?。我们可以添加新的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
它似乎在我的所有测试中都有效。
【问题讨论】:
-
您不能使用任何大型库,或者不能使用特定大型库(jQuery)?
-
任何,我的朋友。它适用于非常特定的移动浏览器,我的客户不想要大型库。我对 JavaScript 很熟悉,可以在没有库的情况下工作,但是这几个方法在这个项目中非常有用。
-
更新了帖子,删除了一些在我的使用中没有正确含义的保留字。