在对象中定义JavaScript获取和设置函数,而不使用“;这个“;
Define JavaScript get and set function in object without using "this"?
我有一个简单的全局对象,带有get和set函数。JSlint不喜欢我在get和set函数中使用"this",因为它违反了"use strict"。我该用什么来代替"this",这样它就不会违反"use strict"(即,我如何在不使用"this"的情况下引用"this"所引用的同一个东西)?
function fnDirty() {
"use strict";
var bIsdirty = false;
this.get_bIsdirty = function() {return bIsdirty; };
this.set_bIsdirty = function(x) {bIsdirty = x; };
}
var GV_oDirty = new fnDirty();
按照惯例,构造函数函数以大写字母开头。如果您在构造函数中,但您的函数以小写字母开头,因此它不会被识别为构造函数,那么JSLint将允许在严格模式下使用this
。
function FnDirty() {
//your code
}
回答您剩下的问题:"在没有构造函数的情况下,做这件事的迂回方法是什么?"
布莱恩的想法很正确,但他真正创造的是一个拥有私人财产的单一物体,而不是一个工厂。
因此,如果你想要一个函数,它赋予"类"的每个实例它自己的私有属性的唯一副本,你可以这样做(我将说明一个比"Foo"answers"Bar"更有用的东西的实际类,以更好地说明这个概念——将其重新组合成你想要的用途应该很简单):
var makeWallet = function (starting_amount) {
var amount = starting_amount,
overdraft = 1000,
addAmount = function (added_funds) { amount += added_funds; },
deductAmount = function (extracted_amound) {
if (is_sufficient_funds(amount, overdraft, extracted_amount)) {
amount -= extracted_amount;
return makeWallet(extracted_amount);
}
},
// other needed public/helper methods here...
// checkBalance(), is_sufficient_funds(), etc...
public_interface = {
// add all public-API methods you need here
addFunds : addAmount,
deductFunds : deductAmount
};
return public_interface;
};
现在,您有一个函数,它将返回一个对象。每个对象都有访问该对象自己的"私有"(即:封闭)amount
变量的方法,该变量对于这些方法是唯一的,并且只能由这些方法访问。
无论您是在私有范围中将函数构建为vars,还是在私有范围中将它们构建为函数声明,或者将它们直接放入return { func1 : () {...},... };
中,都是无关紧要的,只要它们在调用该函数时被定义在该函数内部(即:不在原型链上——无论如何,你不能在该模式中使用它——你将not用new调用该函数)。
好吧,一切都很好。你现在有了一个正在工作的钱包制造商(没有安全和用户功能,yadda yadda…作业)。
但是,如果您想添加PRIVATE STATIC成员,该怎么办?如果你需要跟踪序列密钥,这样你就可以向人们发放银行卡,该怎么办?或者您需要跟踪分支机构的编号?这就是布莱恩的IIFE发挥作用的地方。除了它将返回钱包FACTORY而不是返回完成的钱包对象。
var makeWallet = (function () {
var serial_num = 0,
branch_num = "A011002z";
function walletMaker = function (starting_amount) {
/*same function as before, except that you ALSO call:
serial_num += 1; in the construction of the wallet, and assign the id */
var id = serial_num += 1;
return wallet;
}
// then you return the wallet-factory
// which becomes the new value of the outer function
return walletMaker;
}());
现在您有了静态属性(在最外层的闭包中,钱包工厂将作为"静态"成员永久访问这些属性),AND您有了基于实例的私有成员,在创建实例对象期间添加的内部方法将完全访问这些成员。
唯一的缺点是:
失去这个特定类的原型能力,因为你没有使用构造函数。啊。如果您的对象需要此设置,那么不需要它是值得的…
……如果他们不这样做,并且公共的一切都很酷,那么只需使用构造函数和原型——或者只构建内联对象,不使用任何方法,并构建服务(函数)来对每个类似构建的对象进行操作。如果你以这种方式构建所有对象,当你创建数千个或数万个这样的对象,每个对象都有自己的函数副本(以包含私有引用)时,你将遭受内存损失。同样,这是您为功能付出的代价。在必须使用安全/干净接口的地方使用内存,在不需要的地方使用。
不用说,但要避免在金融机构中使用这种方法,因为面向客户的代码并不是信任添加和删除真实货币的最佳场所。。。
希望这能澄清一切。
您可以使用另一种方法:
var fnDirty = (function() {
var _isDirty = false;
return {
get_dirty: function() { return _isDirty; },
set_dirty: function(val) { _isDirty = value; }
};
})();
- 为什么这个函数调用会破坏程序并导致未定义的变量
- 可以'我搞不清楚这个函数是怎么工作的
- 这个函数做什么以及如何在没有'带有'语句-Javascript
- 如何在 jquery 中循环这个函数
- 我能把这个函数一分为二吗
- JavaScript 新手:我可以将列表传递到这个函数中并让它仍然工作吗?
- JavaScript:return WebForm_FireDefaultButton();这个函数在做什么,我该如何复
- 我怎样才能重写这个函数,这样我就不会'不必显式地键入范围内的每个IP地址
- 为什么这个函数执行了两次
- HTML JavaScript,我如何能够通过给每个元素一个不同的Id来使用JavaScript使这个函数工作
- 为什么获胜't这个函数给我元素的名称it's绑定到
- 有人能向我解释一下为什么我们在这个函数中需要一个for循环吗
- 怎么能做这个函数纯
- 对我来说,用javascript设置这个函数最有效的方法是什么
- 为什么这个函数在JS中返回undefined.property
- 为什么这个 setTimeout() 方法在这个函数中不起作用
- 什么'It’这个函数现在正在运行
- 为什么图像选择器程序中的这个函数 js 不起作用
- 为什么我必须绑定这个函数参数
- 为什么这个函数不能无限循环