在对象中定义JavaScript获取和设置函数,而不使用;这是什么;?

在对象中定义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

我有一个简单的全局对象,带有get和set函数。JSlint不喜欢我在get和set函数中使用“this”,因为它违反了“use strict”。我应该用什么来替换“this”,这样它就不会违反“use strict”(即,我如何引用“this”所引用的相同事物而不使用“this”)


您可以使用另一种方法:

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