有时我们在定义新对象时会丢失新关键字
obj = new Clazz(); //correct
obj = Clazz(); //wrong, but no syntax error, hard to debug.
我想编写一个函数来帮助我创建Class并使其更安全。
var Class = function(){
var constructor = arguments[0];
var superClasses = arguments[1..n];
function clazz(){
if(! this instanceof clazz){
return new clazz()//pass clazz arguments,not Class arguments
}
constructor();//pass clazz arguments
}
//clazz inherit from superClasses
return clazz;
}
var MyClazz = Class(function(name){
this.name = name
}, SuperClazz1, SuperClass2 )
MyClazz.extend({
show: function(){console.log(this.name)}
})
obj1 = new MyClazz("name1");
obj2 = MyClazz("name2");
// obj1 should same as obj2
是否可以,任何存在的模块?
答案 0 :(得分:3)
有时我们会丢失新关键字...
所有关于编码规则和测试...无论如何,继续你的问题。
要确定您的函数是否作为构造函数调用,请使用instanceof
:
function Foo() {
console.log(this instanceof Foo);
}
Foo(); // false
new Foo(); // true
当一个函数作为构造函数调用时this
引用新创建的对象,否则this
引用该函数被调用的对象,以防它没有被调用{{1将引用全局对象。
<强>更新强>
无法将变量参数传递给构造函数。 this
会产生new clas.call(....)
不是构造函数的错误。
你可以做两件事:
call
函数本身,而是返回一个创建新实例的函数,设置所有需要的东西,然后返回该实例(这将使继承变得更加复杂)< / LI>
Class
关键字。我已经编写了自己的Class thingy,并且我尝试同时支持new
和new
语法来创建实例。整个继承的东西等都足够复杂,只是为了节省 4 更多的角色更加神奇......不值得努力。使用()
并编写测试。
另一次更新
好吧,我无法抗拒更多的攻击,我让它成功了:
new
至少在我的情况下,这将起到魔力。
答案 1 :(得分:1)
很抱歉这个答案迟交,但我相信它会直接回答你的问题。我的解决方案是检查构造对象的类型并采取相应的行动。
您可以在此处查看我的解决方案: http://mikepackdev.com/blog_posts/9-new-scope-safe-constructors-in-oo-javascript
我希望这有帮助!