我有两个变量(技术上这里是“常量”,它们按此顺序定义):
const variable1 = function(someParam){//constructor function
if(arguments.callee.caller === this.constructor.prototype.variable2ID){
if(/*some stuff*/){
/*some setup using the this keyword*/
}else
return this.constructor.prototype.variable2ID(document).ready(someParam);
}else{
return Object.create(null);
}
}
和
const variable2 = function(someParam){
return new this.createVariable1(someParam);
}
variable1有一些继承设置及其构造函数:
variable1.prototype = Object.create( Array.prototype );
variable1.prototype.constructor = variable1;
稍后,我定义了一些属性(再次按此顺序):
Object.defineProperty(variable1.prototype, "variable2ID", {
value: variable2,
__proto__: variable2.prototype,
enumerable: false,
configurable: false,
writable: false
});
和
Object.defineProperty(variable2, "createVariable1", {
value: variable1,
__proto__: variable1.prototype,
enumerable: false,
configurable: false,
writable: false
});
我的问题如下:
当我致电variable2("*")
时,它会抛出错误:TypeError: this.createVariable1 is not a constructor
我不明白为什么抛出这个错误,因为variable2.createVariable1
中存储的函数是variable1
,它是一个构造函数。
甚至更奇怪的是,当我明确地调用new variable2.createVariable1("*")
时,它会执行预期的操作(即调用variable1
并返回Object.create(null)
,因为没有从variable2
调用。)
我的问题是:
在尝试使用this
关键字在函数中创建对象时,您能帮我弄清楚我做错了什么吗? (以及如何在variable1
)
variable2
)的调用
非常感谢您的答案。
答案 0 :(得分:0)
所以,经过一些调试并对JSfiddle进行了一些测试,以确定我是否应该将该属性附加到variable2.prototype
或variable2
我偶然发现并粉碎了我的因为我没先注意到它而撞到我的桌子上:
在我的职能中:
const variable2 = function(someParam){
return new this.createVariable1(someParam);
}
this
关键字(在调用variable2(/*params*/)
时)绑定到window
(因为这是默认行为,因为对console.log
的调用实际上是对{{}的调用1}})。
因此,我刚刚将window.console.log
替换为this
,如下所示:
arguments.callee
这也解决了属性定义“问题”。为了使用const variable2 = functon(someParam){
return new arguments.callee.createVariable1(someParam);
}
,定义如下:
arguments.callee
如果在原型上定义它,则Object.defineProperty(variable2, "createVariable1", {
未定义。
非常感谢那些试图帮助我的人:D!
的修改
为了符合弃用,这是一个更新版本(如果它甚至是远程必要的):
arguments.callee.createVariable1
和
const variable2 = function f(someParam){
return new f.createVariable1(someParam);
}
答案 1 :(得分:-1)
我看到的问题是<{p}}里面的this
return new this.createVariable1(someParam);
不是引用variable2
对象而是引用窗口,因为variable2
不是窗口以外的任何父对象的一部分。如果你在函数内console.log(this)
,它会告诉你这个。
如果您正在尝试制作生成器功能,可以将代码更改为:
function variable2(someParam){
this.create = function () {
return new this.createVariable1(someParam);
}
}
和生成器如下:
var creator = new variable2("*");
console.log(creator.create());