我有这个函数,它定义了一个名为store的新类型。我装饰/修改app.set,如下所示,以便打印到console.log。
但在那之后,当试图调用app.set(下面设置b)时,我得到TypeError:无法设置属性' b'未定义的。我认为这与无法找到这个'有关。这段代码有什么问题?
function store(obj){
this.data = obj || {};
}
store.prototype.get = function(k){
return this.data[k];
}
store.prototype.set = function(k, v){
return this.data[k] = v;
}
app = new store();
app.set('a',1);
app.set = (function(old){
return function(k, v){
console.log(k + ' yea!');
old(k, v);
}
})(app.set)
app.set('b',2);
答案 0 :(得分:0)
那是因为old
app.set
不再引用app
了。您需要call
或apply
到正确的实例:
old.call(app, k, v);
为了更清楚地看到差异,举几个例子:
var obj = {
name: "Heisenberg",
sayMyName: function() {
console.log(this.name);
}
};
obj.sayMyName(); // Prints "Heisenberg"
var say = obj.sayMyName;
say(); // Prints ""
say.call({ name: "Lucy" }); // Prints "Lucy"