“伪造”JavaScript构造函数

“伪造”JavaScript构造函数,javascript,function-prototypes,Javascript,Function Prototypes,上下文 我正在努力提高我的JavaScript技能,并学习更多关于原型的知识。我想更好地理解这个问题中的代码以及它的任何限制或问题 一件不明显的事情是定义了比简单初始化更复杂的构造函数。我想做的是让一个类在创建web服务时调用它,而不需要在初始化之后立即调用方法 我所做的是创建一个属性并为其分配一个自调用匿名方法。它似乎像我希望的那样工作,但我不知道是否有更好的方法 代码 } 结果 警报显示:你好,世界 _asyncOrderLine.autoValue = testing: 1001(fal

上下文

我正在努力提高我的JavaScript技能,并学习更多关于原型的知识。我想更好地理解这个问题中的代码以及它的任何限制或问题

一件不明显的事情是定义了比简单初始化更复杂的构造函数。我想做的是让一个类在创建web服务时调用它,而不需要在初始化之后立即调用方法

我所做的是创建一个属性并为其分配一个自调用匿名方法。它似乎像我希望的那样工作,但我不知道是否有更好的方法

代码

}

结果

警报显示:你好,世界

 _asyncOrderLine.autoValue = testing: 1001(false)
 _asyncOrderLine.constructor = 'undefined'
在这种情况下,我希望在创建对象后构造函数保持未定义状态

问题:


有更好的方法吗?使用这种方法会有任何不可预见的副作用吗?

没有必要使事情复杂化。您可以在构造函数中运行所需的任何代码:

function AsyncOrderLine(productID) {

    this.autoValue;
    this._productID = productID;
    this._asyncRequestComplete = false;

    this.hello = function () {
        alert("hello world");
    }

    // Run whatever arbitrary code you want...    
    this.hello();
    this.autoValue = "testing: " + productID + "(" + context._asyncRequestComplete + ")";
}

正如其他人所说,没有理由使用构造函数属性。您只需在函数体中运行所需的任何代码,它将在对象初始化时运行。如果您想要运行异步代码,比如ajax调用,那么您可能需要将一个完成函数传递到构造函数中,这样对象的创建者就可以知道对象初始化的异步部分何时实际完成,因为当对象从初始化返回时,它将不会完成。看起来是这样的:

function function AsyncOrderLine(productID, fn) {
    // initialization code for the object here
    this._asyncRequestComplete = false;
    ...

    // kick of asychronous networking call here
    var context = this;
    $.getJSON(url, function(data) {
        // process the data response into our object here
        context.whatever = data;

        context._asyncRequestComplete = true;
        // call the completion function with `this` set to point to our object here 
        // so the creator of this object can know when the async part of
        // initialization is actually done
        fn.call(context);
    });
}
var x = new AsyncOrderLine(id, function() {
    // can reference new object and it's methods and properties via "this"
    alert("orderLine object is now completely initialized");
});
然后,来电者会这样做:

function function AsyncOrderLine(productID, fn) {
    // initialization code for the object here
    this._asyncRequestComplete = false;
    ...

    // kick of asychronous networking call here
    var context = this;
    $.getJSON(url, function(data) {
        // process the data response into our object here
        context.whatever = data;

        context._asyncRequestComplete = true;
        // call the completion function with `this` set to point to our object here 
        // so the creator of this object can know when the async part of
        // initialization is actually done
        fn.call(context);
    });
}
var x = new AsyncOrderLine(id, function() {
    // can reference new object and it's methods and properties via "this"
    alert("orderLine object is now completely initialized");
});

一般来说,你所做的一切都很好。您根本不需要公开名为构造函数的属性。。您可以让函数在AsyncOrderLine中运行。然后可以避免将undefined赋值给_instance.constructor。然而,这个问题非常广泛,很难正式回答。有无数种方法可以完成您所做的事情。我所做的是创建一个属性并为其分配一个自调用匿名方法。-你为什么这么做?@ŠimeVidas我打算把它叫做构造函数以外的东西,并给它赋值。我为这个问题重新命名了它。问题是我想在创建对象时运行一个函数。@dmck但为什么要将代码放在嵌套函数中,为什么要将该函数的返回值赋给实例的属性?上下文变量的名称不好,它是对实例的引用,即构造函数创建的普通对象。为什么不将其称为asyncOrderLine,因为如果构造函数名称是描述性的,那么它就是asyncOrderLine。