javascript,在匿名对象创建过程中访问其他成员?

时间:2012-04-26 10:31:52

标签: javascript this member anonymous

尝试使用以下代码;由于为store变量分配了一个匿名对象,因此使用函数调用填充“data”属性。此设置还应设置其他对象的属性“masterData”的内容。我希望“this”关键字引用正在创建的匿名对象,但我错了......

    var store = {

        masterData : [],

        revert: function() {

            this.data = shallowCopy(this.masterData);
        },

        data: (function() {

            var overviewData = getOverviewData();
            this.masterData = overviewData;
            return chartData;

            }).call(),
    };

另见“revert”属性;它给出了一个函数,它将创建对象的数据属性内容的副本。

应该使用什么,因为“this”返回DOMWindow对象?

4 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,我只是通过函数发送范围来解决它。

    var self = this;
    setInterval( yourFunction(self), 1000);

    yourFunction:function( self )
    {
        console.log(this);
        console.log(self);
    }

你看到它记录“this”时它指的是DOM,而self指的是你来自哪里。我希望这有帮助! :)

编辑: 而不是在内部数据中设置masterData,在创建数据后设置主数据。

var store = {

    masterData : [],

    revert: function() {

        this.data = shallowCopy(this.masterData);     //Here is where you create data
        masterData = this.data.overviewData;       //set the masterData
    },

    data: (function() {

        var overviewData = getOverviewData();
        return chartData;

        }).call(),
};

我认为这应该有效,否则抱歉:)

答案 1 :(得分:2)

在定义对象之前调用data函数; this在该对象出现之前不会成为对象的别名。您可以将构造函数与私有的短期变量一起使用:

var getOverviewData = function () { return "I'm overview data!" }
var chartData = "I'm chart data!"

var store = new function () {
  var _masterData
  this.revert = function() {
    this.data = shallowCopy(this.masterData)
  }
  this.data = (function() {
    _masterData = getOverviewData()
    return chartData
  }).call()
  this.masterData = _masterData
}()

console.log(store)
// { revert: [Function],
//   data: 'I\'m chart data!',
//   masterData: 'I\'m overview data!' }

答案 2 :(得分:1)

更改以下行

}).call(),

})()

或者,如果您真的想使用call方法:

 }).call(store)

答案 3 :(得分:0)

this不会在调用匿名函数时引用当前对象,因为它不遵循obj.func()模式,后者在this范围内设置了funcobj并不受其他方式的约束。而是引用global window object(或strict mode中的undefined)。

callapplybind没有帮助,因为尚未定义store对象,因此没有对象可以作为{{1} }参数。另一方面,对于thisArgstore.revert在被调用时this指向store并表现出预期的行为。

该示例似乎过于人为,因为没有明显的动机将masterData设置为还设置data的匿名函数的副作用。看来您可以执行以下操作:

// some sameple funcs and data for testing purposes
var getOverviewData = function () { return [42]; };
var shallowCopy = function (a) { return a.slice(); };
var chartData = [24];

var store = {
  masterData: getOverviewData(),

  revert: function () {
    this.data = shallowCopy(this.masterData);
  },

  data: chartData,
};

console.log(store.data);
store.revert();
console.log(store.data);

通常,如果应用某种模式似乎很尴尬,那么它通常是不必要的,或者是获得理想结果的次佳方法。 OP提出的data IIFE设置器打破了经验法则:它没有单一职责,并且通过使对象变异而产生副作用。

现在,假设您在定义此属性时确实确实需要从IIFE访问this(或者对于确实有正当动机的未来读者),有多种实现方法。 / p>

最明显和直接的解决方案是创建store对象,然后添加数据并对其进行第二步突变:

var getOverviewData = function () { return [42]; };
var shallowCopy = function (a) { return a.slice(); };
var chartData = [24];

var store = {
  masterData: [],

  revert: function () {
    this.data = shallowCopy(this.masterData);
  },
};
store.data = (function () {
  this.masterData = getOverviewData();
  return chartData;
}).call(store);

console.log(store.data);
store.revert();
console.log(store.data);

如果您不喜欢这两个步骤,可以将其放入IIFE:

var getOverviewData = function () { return [42]; };
var shallowCopy = function (a) { return a.slice(); };
var chartData = [24];

var store = (function () {
  var store = {
    masterData: [],

    revert: function () {
      this.data = shallowCopy(this.masterData);
    },
  };
  store.data = (function () {
    this.masterData = getOverviewData();
    return chartData;
  }).call(store);
  return store;
})();

console.log(store.data);
store.revert();
console.log(store.data);

一种替代方法是使用here所示的构造函数,并使用new调用它,从而使您可以访问this上下文。

您正在使用的IIFE可能是一个单独的函数,完全可以接受一个对象作为参数并对其上的两个属性进行突变,但这只是出于完整性的考虑;仅当您计划将函数重用于多个对象时,它才可能有用。在这种情况下,您最好创建一个成熟的class或非IIFE构造函数。