Javascript范围,这个,原型

时间:2014-03-20 15:13:49

标签: javascript

我有这个函数,它定义了一个名为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);

1 个答案:

答案 0 :(得分:0)

那是因为old app.set不再引用app了。您需要callapply到正确的实例:

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"