我有一个JavaScript" class"其中包含一个方法bar()
,我希望根据其上下文采取不同的行为。
换句话说,根据我实例化blah
的页面,我希望bar()
做不同的事情。
你在这里建议什么方法?我的第一个想法是blah
构造函数中的依赖注入。
function blah(){
}
blah.prototype.foo = function(){
bar(arguments);
};
以下是同一方法https://jsfiddle.net/7ht8dud6/
中bar
的不同实现的示例
答案 0 :(得分:0)
通过阅读你的小提琴,在我看来,你没有错......在构造函数中使用注入可以被认为是一种很好的做法。
顺便说一句,还有其他方法可以满足您的需求。
例如,如果仅bar
方法需要foo
依赖关系,您可以考虑将其作为回调传递,这会使事物更加封装并隐藏依赖关系课程背景的其余部分:
function Blah() {};
Blah.prototype.foo = function(cb, data) {
console.count('foo');
console.log(cb);
return cb(data);
};
var example = new Blah();
// and use it in this way:
example.foo(
function(data) { return 1 + data; },
55
);
// or
example.foo = example.foo.bind(example, function(data) { return data + 1; });
example.foo(4);
example.foo(3);
正如我在上述评论中所提到的那样等待更多信息,您可以考虑bind
对象的Function
方法,该方法允许您为其传递不同的上下文执行时间处理时间。
Function.prototype.bind - Mozilla开发者网络
一个简单的例子:
function printName() {
return document
.getElementById('result')
.innerText = this.name
;
};
function prepareButtons() {
var list = [
{ name: 'Hitmands', selector: '#btn1' },
{ name: 'Foo', selector: '#btn2' },
{ name: 'Bar', selector: '#btn3' }
];
function attach(element, context) {
element = document.querySelector(element);
return element && element.addEventListener('click', printName.bind(context));
}
list.forEach(function(item) {
attach(item.selector, item);
});
}
document.addEventListener('DOMContentLoaded', prepareButtons);
<h1 id="result">result</h1>
<button id="btn1">Hitmands</button>
<button id="btn2">Foo</button>
<button id="btn3">Bar</button>