"伪造“;JavaScript构造函数
"Faking" a JavaScript Constructor
上下文
我正在努力提高我的JavaScript技能,我正在学习更多关于原型的知识。我想更好地理解这个问题中的代码以及它的任何限制或问题。
有一件事并不明显,那就是定义更复杂的构造函数,这些构造函数所做的不仅仅是简单的初始化。我想做的是让一个类在创建web服务时调用它,而不需要在初始化后立即调用方法。
我所做的是创建一个属性,并为其分配一个自调用的匿名方法。它看起来像我希望的那样工作,但我不知道是否有更好的方法。
代码
function AsyncOrderLine(productID) {
var context = this;
this.autoValue;
this._productID = productID;
this._asyncRequestComplete = false;
this.hello = function () {
alert("hello world");
}
this.constructor = (function () {
context.hello();
context.autoValue = "testing: " + productID + "(" + context._asyncRequestComplete + ")";
})()
}
结果
var _asyncOrderLine = new AsyncOrderLine(1001);
显示警报:"Hello World">
_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");
});
相关文章:
- “var”变量,“this”变量和“global”变量 - 在JavaScript构造函数中
- JavaScript 构造函数中的“var”变量会发生什么
- 创建 JavaScript 构造函数时的语法错误
- 为什么可以't JavaScript构造函数创建字符串或数字
- JavaScript-构造函数参数和原型继承
- 在Javascript构造函数中定义属性的正确方式
- JavaScript构造函数参数
- JavaScript构造函数、原型附加方法和'这'
- JavaScript:构造函数与原型
- 通过JavaScript构造函数引入循环依赖关系
- javascript构造函数中的getElementById
- Javascript构造函数创建对象与常规对象
- JavaScript - 构造函数中的继承
- 是否存在替换Javascript构造函数的问题'原型,而不是添加到原型中
- Javascript构造函数似乎正在丢失数据
- Javascript“构造函数”属性中的错误 - IE 8
- 创建一个 JavaScript 构造函数,该函数对数组进行子类化
- 如何在嵌套原型中访问 JavaScript 构造函数变量
- JavaScript构造函数序言的目的是什么
- 新手:Javascript构造函数和范围上下文问题