作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
有时我们在定义新对象时会丢失 new 关键字,
obj = new Clazz(); //correct
obj = Clazz(); //wrong, but no syntax error, hard to debug.
我想编写一个函数来帮助我创建类并使其成为新的安全对象。
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
是否可能,任何存在的模块?
最佳答案
sometimes we loss the new keyword...
所有关于编码纪律和测试......无论如何,继续你的问题。
要查明您的函数是否作为构造函数被调用,请使用 instanceof
:
function Foo() {
console.log(this instanceof Foo);
}
Foo(); // false
new Foo(); // true
当作为构造函数调用函数时 this
指的是新创建的对象,否则 this
指的是函数被调用的对象,以防它不是调用任何东西 this
将引用全局对象。
更新
将可变参数传递给构造函数是不可能的。 new clas.call(....)
将产生一个错误,即 call
不是构造函数。
你可以做两件事:
Class
函数本身,而是返回一个创建新实例的函数,设置所有需要的东西,然后返回该实例(这将使继承更有效复杂)new
关键字即可。我自己写了Class thingy ,并且我尝试支持 new
和 ()
语法来创建实例。整个继承之类的东西已经够复杂了,让它更神奇只是为了多保存4个 Angular 色……不值得付出努力。使用 new
并编写测试。
另一个更新
好吧,我无法抗拒更多的破解,我成功了:
function is(type, obj) {
return Object.prototype.toString.call(obj).slice(8, -1) === type;
}
function clas(args) {
if (is('Object', this)) {
ctor.apply(this, is('Arguments', args) ? args : arguments);
} else {
return new clas(arguments);
}
}
至少在我的情况下,这会产生魔力。
关于javascript : make a new safe class constructor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4530878/
我是一名优秀的程序员,十分优秀!