一直在使用非常喜欢的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
。
如何将函数作为构造函数的参数并使该函数具有对象的范围?
答案 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
,所以使用额外的论点,self
。 self
不会暴露给整个世界,只会暴露给需要看到它的函数。
'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);