gpt4 book ai didi

javascript : make a new safe class constructor

转载 作者:搜寻专家 更新时间:2023-11-01 00:34:28 25 4
gpt4 key购买 nike

有时我们在定义新对象时会丢失 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 不是构造函数。

你可以做两件事:

  1. 不是从类工厂方法中返回 Class 函数本身,而是返回一个创建新实例的函数,设置所有需要的东西,然后返回该实例(这将使继承更有效复杂)
  2. 只需使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com