在JavaScript中冻结对象内部的引用常量

时间:2018-08-04 01:17:32

标签: javascript node.js ecmascript-6

在selectors.page2Data._3txtFamilyName中分配myData.firstName的正确方法是什么: 有可能吗?

module.exports = Object.freeze({
myData: {
    firstName : 'first',
    lastName : 'last ',
    streetNum : 'number',
},
selectors:{
    page2Data:{

        _3txtFamilyName: function(){ return myData.firstName},
        _4txtgivenName:  function(){this.myData.lastName},
        _5txtAddressStreetNo:  function(){this.myData.streetNum} ,


    }
}
});

3 个答案:

答案 0 :(得分:0)

简单的方法是将整个对象分配给一个变量,然后根据需要在内部使用该变量。然后导出该变量

const obj = Object.freeze({
  myData: {
    firstName: 'first',

  },
  selectors: {
    page2Data: {
      _3txtFamilyName: function() {
        return obj.myData.firstName
      }


    }
  }
})
//module.exports = obj
console.log(obj.selectors.page2Data._3txtFamilyName())

答案 1 :(得分:0)

此对象的组织使其使用功能非常不便。这些函数中的this将引用page2Data对象,而不是主要的父对象。因此,使用this.myData将在这些函数中返回undefined。

如果您绝对不能将其更改为更方便的对象,则可以使用call()调用函数并传入外部对象。但这是一种非常丑陋的方式:

let e = Object.freeze({
  myData: {
    firstName: 'first',
  },
  selectors: {
    page2Data: {
      _3txtFamilyName: function() {
        this.myData.firstName = "mark"
      },
    }
  }
});

e.selectors.page2Data._3txtFamilyName.call(e) // pass in explicit value for this
console.log(e.myData)

一种替代方法是将selectors更改为getter函数。这将允许您捕获封闭中的外部对象:

let e = Object.freeze({
  myData: {
    firstName: 'first',
  },
  get selectors() {         // getter instead of plain object
    let self = this         // capture this
    return {
      page2Data: {
        _3txtFamilyName: function() {
          self.myData.firstName = "mark"
        },
      }
    }
  }
});

// now you can call it normally
e.selectors.page2Data._3txtFamilyName(e)
console.log(e.myData)

答案 2 :(得分:0)

在当前环境下执行此操作的最佳方法是执行以下操作,

module.exports = Object.freeze({
    myData: {
        firstName : 'first',
        lastName : 'last ',
        streetNum : 'number',
    },
    selectors:{
        page2Data:{

            _3txtFamilyName: function(){
                return module.exports.myData.firstName
            },
            _4txtgivenName:  function(){
                return module.exports.myData.lastName
            },
            _5txtAddressStreetNo:  function(){
                return module.exports.myData.streetNum
            } ,


        }
    }
});