1

例は、このJSFiddleで見ることができます

インスタンスを作成し、そのインスタンスの関数の 1 つを変更してから、そのインスタンスの別の関数内でその関数を呼び出しています。更新された関数内のローカル変数とインスタンス変数にアクセスできません。

コード

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

古い名前と新しい名前をdoOnSetName( Fiddle )に渡すことができます。

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 に答える
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 に答える