在对象中定义JavaScript获取和设置函数,而不使用“;这个“;

Define JavaScript get and set function in object without using "this"?

本文关键字:这个 函数 定义 对象 JavaScript 获取 设置      更新时间:2023-09-26

我有一个简单的全局对象,带有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 : () {...},... };中,都是无关紧要的,只要它们在调用该函数时被定义在该函数内部(即:不在原型链上——无论如何,你不能在该模式中使用它——你将notnew调用该函数)。

好吧,一切都很好。你现在有了一个正在工作的钱包制造商(没有安全和用户功能,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您有了基于实例的私有成员,在创建实例对象期间添加的内部方法将完全访问这些成员。

唯一的缺点是:

  1. 失去这个特定类的原型能力,因为你没有使用构造函数。啊。如果您的对象需要此设置,那么不需要它是值得的…
    ……如果他们不这样做,并且公共的一切都很酷,那么只需使用构造函数和原型——或者只构建内联对象,不使用任何方法,并构建服务(函数)来对每个类似构建的对象进行操作。

  2. 如果你以这种方式构建所有对象,当你创建数千个或数万个这样的对象,每个对象都有自己的函数副本(以包含私有引用)时,你将遭受内存损失。同样,这是您为功能付出的代价。在必须使用安全/干净接口的地方使用内存,在不需要的地方使用。

不用说,但要避免在金融机构中使用这种方法,因为面向客户的代码并不是信任添加和删除真实货币的最佳场所。。。

希望这能澄清一切。

您可以使用另一种方法:

var fnDirty = (function() {
  var _isDirty = false;
  return {
    get_dirty: function() { return _isDirty; },
    set_dirty: function(val) { _isDirty = value; }
  };
})();