在下面的代码中,当我执行跟踪功能并且变量“original”被分配给o [m]时最初未定义但是一旦我将o [m]定义为跟踪和跟踪函数内的嵌套函数,我希望“原始”变量的值应该是新定义的嵌套函数,但令我惊讶的是它仍未定义。我不明白为什么?
var o = {};
function trace(o, m) {
var original = o[m];
o[m] = function () {
alert(new Date(), "Exiting:", m);
var result = original.apply(this, arguments);
alert(new Date(), "Exiting:", m);
alert(result);
};
}
trace(o, "m");
o.m("My JavaScript");
答案 0 :(得分:4)
更改用于设置源的源时,标识符不会更新。
var o = {prop: function () {return 'old ref';}};
var foo = o.prop; // foo() === "old ref"
o.prop = function () {return 'new ref';};
foo(); // "old ref"
但是,它也可能值得注意
var e = o; // o as before
o.prop = function () {return 'even newer ref';};
e.prop(); // "even newer ref"
e === o; // true
当标识符引用 Object 时,它引用同一个对象而不是副本,因此对其进行的更改会影响它们。这是因为您使用标识符而不是 Object 的属性访问 Object ,即e === o
如果您要执行o = fizz
,o
现在指向e
的其他内容,e !== o
var fizz = {buzz: "I'm something new!"};
o = fizz;
e.buzz; // undefined, e points at {prop: function () {...}}, not fizz
o.prop(); // TypeError, o points at fizz, not e
o.buzz; // "I'm something new!"
e === o; // false
fizz === o; // true
最后,通过查看您尝试做的事情,您可能需要考虑“之前有什么事吗?”。这就是您的代码当前正在抛出错误的原因。
function change(obj, prop, echo) {
var prev_method = obj[prop];
obj[prop] = function () {
if (prev_method) // only if we had something before
prev_method.apply(this, arguments); // try to invoke it
console.log(echo);
};
}
var o = {};
change(o, 'spell', 'H');
change(o, 'spell', 'e');
change(o, 'spell', 'l');
change(o, 'spell', 'l');
change(o, 'spell', 'o');
o['spell'](); // returns undefined, logs H, e, l, l, o