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在该标识符中使用了大写字母……这只是构造函数的最佳实践。还要注意我是如何setupprototype. 这比将其定义为实例的属性(使用 )要高效得多,this.setup因为内存中只需要存在一个函数副本。

现在这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 回答