测试JavaScript对象时出现意外结果

测试JavaScript对象时出现意外结果,javascript,js-test-driver,Javascript,Js Test Driver,我正在真正学习使用JavaScript对象的细微差别,但遇到了一个障碍 我有一组“名称空间”对象来分割DOM和模型,以便对其进行操作。代码如下: function Sandbox2(){ this.page = { FirstName: document.getElementById("FirstName") , LastName: document.getElementById("LastName") , Email: document.getElementById

我正在真正学习使用JavaScript对象的细微差别,但遇到了一个障碍

我有一组“名称空间”对象来分割DOM和模型,以便对其进行操作。代码如下:

function Sandbox2(){
this.page = {
      FirstName: document.getElementById("FirstName")
    , LastName: document.getElementById("LastName")
    , Email: document.getElementById("Email")
};

this.model = {
      FirstName: "James"
    , LastName: "Eggers"
    , Email: "James.R.Eggers@gmail.com"
};

this.behavior = {};

this.bindPageToModel = function(){
    for(var property in this.page){
        if (property){
            property.value = this.model[property];
        }
    }
};

    this.bindModelToPage = function(){
    for(var property in this.model){
        if (property){
            this.model[property].value = this.page[property];
        }
    }
};
};
使用JsTestDriver,我正在做大量的测试,尝试页面和模型对象的一些功能。具体测试如下:

"test ModelBinding should be allowed." : function(){
        var sandbox2 = new Sandbox2();
        var page = sandbox2.page;
        page.FirstName = "Test";
        page.LastName = "Account";
        sandbox2.bindModelToProperty();

        assertEquals("Ensure the new values took.", page.FirstName, sandbox2.page.FirstName);
        assertEquals("New Page values should be in the model.", "Test", sandbox2.model.FirstName);
    }
在上述测试中,第一个
assertEquals
通过;但是,第二个测试将
sandbox2.model.FirstName
解析为“James”(初始值)


有人对我如何更改代码(原始或测试)以允许我将
页面
对象的值映射到
模型
对象有什么建议吗?

问题似乎在这里:

for(var property in this.page){
    if (property){
        property.value = this.model[property];
    }
}
属性
变量实际上是对象(FirstName、LastName和Email)的键值。您正在这些字符串对象上设置
属性,但没有任何结果

我想你是想做这样的事情:

this.page[property].value = this.model[property];

我将告诉您,实际上,
FirstName:document.getElementById(“FirstName”)
不是一个好主意。您不希望在对象中存储对DOM节点的引用-这可能会为一个节点创建循环引用,而对于另一个节点,如果重建DOM树(例如,因为页面内容被修改为字符串[非良好做法]),则引用将不再有效。在使用DOM节点之前,最好先抓取一个新的DOM节点,而不是在对象的属性中保留对它的引用。@Chris我完全同意。这段代码实际上更像是一个沙盒,我在学习JsTestDriver的同时也在玩它。实际上,每次我都会让页面对象重新检索特定的节点。谢谢Luca!实际上有两个问题。首先,在我的初始代码示例中,我从一个模型转到另一个页面,而不是从一个页面转到另一个模型(所讨论的代码已经更新)。第二个问题是通过指出
property
在本例中是字符串键而不是属性本身来解决的。我必须删除
.value
才能让它工作。再次感谢。