在对象中定义JavaScript获取和设置函数,而不使用;这是什么;?
我有一个简单的全局对象,带有get和set函数。JSlint不喜欢我在get和set函数中使用“this”,因为它违反了“use strict”。我应该用什么来替换“this”,这样它就不会违反“use strict”(即,我如何引用“this”所引用的相同事物而不使用“this”)在对象中定义JavaScript获取和设置函数,而不使用;这是什么;?,javascript,this,jslint,getter,Javascript,This,Jslint,Getter,我有一个简单的全局对象,带有get和set函数。JSlint不喜欢我在get和set函数中使用“this”,因为它违反了“use strict”。我应该用什么来替换“this”,这样它就不会违反“use strict”(即,我如何引用“this”所引用的相同事物而不使用“this”) 您可以使用另一种方法: var fnDirty = (function() { var _isDirty = false; return { get_dirty: function() { ret
您可以使用另一种方法:
var fnDirty = (function() {
var _isDirty = false;
return {
get_dirty: function() { return _isDirty; },
set_dirty: function(val) { _isDirty = value; }
};
})();
按照惯例,构造函数以大写字母开头。如果您使用的是构造函数,但您的函数以小写字母开头,因此不会被识别为构造函数,那么JSLint将允许在严格模式下使用
this
function FnDirty() {
//your code
}
回答您剩下的问题:“没有构造函数的情况下,做这件事的迂回方式是什么?” 布赖恩的想法是正确的,但他真正创造的是一个具有私人财产的单一对象,而不是一个工厂 因此,如果您想要一个函数,该函数授予“类”的每个实例其私有属性的唯一副本,您可以这样做(我将演示一个比“Foo”和“Bar”更有用的实际类),以更好地说明该概念——将其重新组合为您的预期用途应该非常简单): 现在,有一个函数将返回一个对象。每个对象都有访问该对象自己的“private”(即:closed-over)
amount
变量的方法,该变量对于这些方法来说是唯一的,并且只能对这些方法访问
无论您是在私有范围中将函数构建为变量,还是在私有范围中将它们构建为函数声明,或者将它们直接放入返回{func1:(){…},…}代码>是不相关的,只要它们在调用该函数时定义在该函数内部(即:不在原型链上——无论如何,这在该模式中是不能使用的——您将不使用new调用该函数)
好吧,那就好了。你现在有了一个工作的钱包制造商(没有安全和用户功能,yadda yadda……家庭作业)
但是如果您想添加私有静态成员,该怎么办?
如果您需要跟踪序列密钥,以便向人们发放银行卡,该怎么办?或者你需要追踪分行号码?这就是布莱恩的生活发挥作用的地方。除了返回完成的钱包对象之外,它将返回钱包工厂
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;
}());
现在您有了静态属性(在最外层的闭包中,钱包工厂将作为“静态”成员永久访问),和您有了基于实例的私有成员,在创建实例对象期间添加的内部方法将完全访问这些成员
这样做的唯一缺点是:
失去这个特定类的原型功能,因为你没有使用构造函数。无聊的。如果您的对象需要此设置,那么不使用它是值得的…
…如果他们不这样做,并且公开一切都很酷,那么就使用构造函数和原型——或者只构建内联对象,不使用任何方法,构建服务(函数)对每个类似构建的对象进行操作
如果您以这种方式构建所有对象,那么当您创建数千个或数万个对象时,您将遭受内存损失,每个对象都有自己的函数副本(以包含私有引用)。同样,这是您为功能支付的价格。在必须使用安全/干净接口的地方使用内存,在不需要的地方不使用
也不用说,但是避免在金融机构中使用它,因为面向客户的代码不是最好的地方,因为它没有添加和删除真实货币的能力
希望这能澄清问题。我的问题是,为什么这与的“使用严格的”
冲突?jsLint并不是在抱怨你使用这
,而是在抱怨你的类名格式不正确。重命名function Dirty()
的构造函数不会产生错误/警告。但是fndrity
实际上不是一个函数,您不能使用new
创建它的多个实例。感谢Dennis,这是一个很好的调用,JSlint现在对它很满意。这不是为了帮助我学习,而是为了帮助我学习;对于相同的行为,另一种长时间的替代方法是什么(我会用什么来代替“this”以获得相同的结果)?
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;
};
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;
}());