Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript作用域,这个,原型_Javascript - Fatal编程技术网

Javascript作用域,这个,原型

Javascript作用域,这个,原型,javascript,Javascript,我有一个函数,它定义了一个名为store的新类型。我装饰/修改app.set,如下所示,以便它打印到console.log 但在那之后,当尝试调用下面的app.set set set b时,我得到了TypeError:无法设置未定义的属性“b”。我认为这与找不到“这个”有关。这个代码有什么问题 function store(obj){ this.data = obj || {}; } store.prototype.get = function(k){ return this.

我有一个函数,它定义了一个名为store的新类型。我装饰/修改app.set,如下所示,以便它打印到console.log

但在那之后,当尝试调用下面的app.set set 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);
这是因为旧app.set不再引用app。您需要调用或将其应用于正确的实例:

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"