1

可以在这个JSFiddle上看到一个例子

我正在创建一个实例,更改该实例的一个函数,然后在该实例的另一个函数中调用该函数。我在访问更新后的函数中的局部变量和实例变量时遇到了困难。

代码

var MyObj = function (name) {
    var that = this;
    MyObj.myObjs = (MyObj.myObjs || []),
    this.objName = name,
    this.objIdx = MyObj.myObjs.length;
    MyObj.myObjs.push(this.objName);

    this.doOnSetName = function () {};

    this.setName = function (name) {
        that.doOnNameSet();
        that.objName = name;
        MyObj.myObjs[that.objIdx] = name;
    }
}

var obj1 = new MyObj("obj1");
//obj1.doOnNameSet = function() { alert("objName: "+this.objName) };
//obj1.setName("obj1");

var obj2 = new MyObj("obj2");
obj2.doOnNameSet = function () {
    $("#console").append("Old objName: " + this.name
                         + "<br />New objName: " + name + "<br />")
};
obj2.setName("obj2 - changed");

$("#console ").append("Objects: <br />*" + MyObj.myObjs.join(", <br />*"));

实际结果

Old objName: undefined
New objName: result
Objects: 
*obj1, 
*obj2 - changed

期望的结果

Old objName: obj2
New objName: obj2 - changed
Objects: 
*obj1, 
*obj2 - changed
4

4 回答 4

2
that.objName = name;
MyObj.myObjs[that.objIdx] = name;
that.doOnNameSet();

表示在调用监听器时旧名称已经被遗忘。我不确定你打算如何得到它。也许在你改变它之前调用监听器,用新的名字作为参数。

obj2.doOnNameSet = function () {
     $("#console").append("Old objName: " + this.name
                          + "<br />New objName: " + name + "<br />");
};

该属性被命名objName,并且该name变量显然是未定义的。你想把它作为参数吗?

于 2013-05-16T14:05:21.730 回答
2

您可以将旧名称和新名称传递给doOnSetNameFiddle):

var MyObj = function (name) {
    var that = this;
    MyObj.myObjs = (MyObj.myObjs || []),
    this.objName = name,
    this.objIdx = MyObj.myObjs.length;
    MyObj.myObjs.push(this.objName);

    this.doOnSetName = function (oldName, newName) {};

    this.setName = function (name) {
        that.doOnNameSet(that.objName, name);
        that.objName = name;
        MyObj.myObjs[that.objIdx] = name;
    }
}

var obj1 = new MyObj("obj1");
//obj1.doOnNameSet = function() { alert("objName: "+this.objName) };
//obj1.setName("obj1");

var obj2 = new MyObj("obj2");
obj2.doOnNameSet = function (oldName, newName) {
    $("#console").append("Old objName: " + oldName
                         + "<br />New objName: " + newName + "<br />")
};
obj2.setName("obj2 - changed");

$("#console ").append("Objects: <br />*" + MyObj.myObjs.join(", <br />*"));
于 2013-05-16T14:09:00.630 回答
1

错误在您的 obj2.doOnNameSet 方法中。this.name应该是this.objNamename在您的代码片段中未定义,但大概在您的代码中的其他地方定义为“结果”。您可以通过以下更改来解决此问题

obj2.doOnNameSet = function (name) {

最后,您需要在进行更改之前调用 doOnNameSet:

this.setName = function (name) {
        that.doOnNameSet(name);
        that.objName = name;
        MyObj.myObjs[that.objIdx] = name;

    }
于 2013-05-16T14:10:03.550 回答
1

不确定您要做什么,但以下内容将在创建时设置“this”名称并将其保存在共享名称列表中(不是像您的代码那样的全局变量,而是所有实例共享的原型属性)。当使用 setName 时,数组中的名称设置为更改后的名称:

var MyObj = function (name) {
    this.namesIndex=this.names.length;
    this.names.push(name);
    this.objName = name;
}
MyObj.prototype.names=[];
MyObj.prototype.setName = function (name){
  this.objName=name;
  this.names[this.namesIndex]=name;
}
var o1=new MyObj(1);
var o2=new MyObj(2);
o2.setName("2 changed");

console.log(o2.names);
于 2013-05-16T14:26:07.063 回答