即使在分配对象属性方法之后,JavaScript变量也未定义

时间:2015-07-04 00:25:41

标签: javascript

在下面的代码中,当我执行跟踪功能并且变量“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");

1 个答案:

答案 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 = fizzo现在指向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