在javascript构造函数中,如何将paramterized函数放在对象范围内?

时间:2015-07-06 11:56:33

标签: javascript object scope

一直在使用非常喜欢的Crockford constructor,但是在向对象添加范围函数时遇到了问题:

'use strict';

var Constructor = function( params ) {
  let config = params,
      data = params.datum,
      action = function(a,b) { return config.actions[a](b); };
  return Object.freeze({
    action: action
  });
};

var cns = Constructor({
      datum: 123,
      actions: {
        getData: function(b) { return data; }
      } 
});   

cns.action('getData',0);

获取Uncaught ReferenceError: data is not defined

如何将函数作为构造函数的参数并使该函数具有对象的范围?

2 个答案:

答案 0 :(得分:0)

如果您关注Crockford's private members in JavaScript post,那么BOI_TESTFEED|youghalsw1|10014 BOI_TESTFEED|youghalsw2|10015 BOI_TESTFEED|youghalsw3|10013 应该是“特权”功能(可以访问私人成员的功能,例如getData)。因此,此函数应遵循其帖子(JSFiddle example)中给出的“特权”模式。

data

答案 1 :(得分:0)

最简单的方法似乎是手动将对象内容传递给函数,使用call或作为额外参数。因为我正在躲避this,所以使用额外的论点,selfself不会暴露给整个世界,只会暴露给需要看到它的函数。

'use strict';

var Constructor = function( params ) {
  let config = params,
      data = params.datum,
      self = { data: data },
      action = function(a,b) { return config.actions[a](b,self); };
  return Object.freeze({
    action: action
  });
};

var cns = Constructor({
      datum: 123,
      actions: {
        getData: function(b,s) { return s.data; }
      } 
});   

cns.action('getData',0);