0

Javascriptでは、次のようなオブジェクトを作成しています。

var testObject = {
    value: "this is my initial value",
    setup: function() {
        value: "foo"
    }
};

今、私はこのオブジェクトをインスタンス化できるようにしたいので、これを試しています:

var myFirstObject  = new testObject();
var mySecondObject = new testObject();

そのため、呼び出す.setup()と、参照されている新しく作成されたオブジェクトの値のみが変更されます。どうすればこれを達成できますか?このコードは機能していないようです。

4

5 に答える 5

2

オブジェクトをインスタンス化するのではなく、関数をインスタンス化します。

var testObject = function() {
  this.value = "this is my initial value";
  this.setup = function() {
    this.value = "foo";
  }
}

var myFirstObject = new testObject();
var mySecondObject = new testObject();

編集:あなたのコメントによると、このオブジェクトの関数を使用してDOMにバインドする方法は次のとおりです。

document.getElementById('idOfElem').addEventListener(
    'click', myFirstObject.clickHandler);

クリックハンドラーがオブジェクトのコンテキストで実行されるという保証はないことに注意してください(つまり、クリックハンドラーでthisは、インスタンスではない可能性がありtestObjectます)。clickHandlerオブジェクトのインスタンス変数を何らかの方法で変更する場合は、次のようにコンテキストを確認することをお勧めします。

document.getElementById('el').addEventListener('click', 
    function() { 
        myObj.handleClick.apply(myObj, arguments);
    });
于 2012-12-17T09:37:08.620 に答える
1

コードに多くの問題があります。まず、コンストラクター関数を呼び出して、何かをインスタンス化しようとしています。あなたtestObjectは関数ではないので、型エラーが発生します。testObjectあなたはこれらの線に沿った何かになるように変更する必要があります:

var TestObject = function () {
    this.value = "this is my initial value";
};
TestObject.prototype.setup = function () {
    this.value = "foo";
};

その識別子に大文字を使用していることに注意してくださいT...これはコンストラクター関数のベストプラクティスです。また、でメソッドを定義したsetup方法にも注目してprototypeください。this.setupこれは、関数のコピーが1つだけメモリに存在する必要があるため、インスタンスのプロパティとして(を使用して)定義するよりもはるかに効率的です。

これが関数であるため、演算子TestObjectを使用して呼び出すことでインスタンス化できます。new

var myFirstObject = new TestObject();
var mySecondObject = new TestObject();

setupのインスタンスでメソッドを呼び出すと、TestObjectそのインスタンスに適用されます。つまり、メソッドthis内の値はsetup、メソッドが呼び出されたインスタンスを参照します。

myFirstObject.setup();
console.log(myFirstObject.value); // 'foo'
console.log(mySecondObject.value); // 'this is my initial value'
于 2012-12-17T09:37:20.853 に答える
1

コンストラクターを誤って定義しました。これを試して:

function testObject() {
    this.value = "this is my initial value";
    this.setup = function() {
        this.value = "foo"
    }
};

その後、を呼び出すことができますnew testObject()

于 2012-12-17T09:38:33.063 に答える
0

使用しているオブジェクト表記は、静的クラスと比較できるものです。達成しようとしていることのコードは次のとおりです。

var testObject = function(val) {
    this.value = "This is my initial value",

    if (arguments[0]) {
        this.value = val;
    }
};

var first = new testObject(); //uses initial value
var second = new testObject("hi"); //value = hi

この表記を使用してクラスを作成する場合は、次を参照してください:http: //ejohn.org/blog/simple-javascript-inheritance/

于 2012-12-17T09:37:08.267 に答える
0
function yourObject(value, setup) {
        return {
            value: value,
            setup: setup
        };
}

var myFirstObject = new yourObject('a', function(){});
var mySecond = new yourObject('b', function(){});
于 2012-12-17T09:37:39.463 に答える