构造函数被视为“不是构造函数”

时间:2017-07-13 22:53:46

标签: javascript constructor

我有两个变量(技术上这里是“常量”,它们按此顺序定义):

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)的调用



非常感谢您的答案。

2 个答案:

答案 0 :(得分:0)

所以,经过一些调试并对JSfiddle进行了一些测试,以确定我是否应该将该属性附加到variable2.prototypevariable2我偶然发现并粉碎了我的因为我没先注意到它而撞到我的桌子上:

在我的职能中:

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());