JavaScript继承对象.create

JavaScript继承对象.create,javascript,internet-explorer,inheritance,prototype,object-create,Javascript,Internet Explorer,Inheritance,Prototype,Object Create,好的,我正在尝试跟踪对web应用程序上的巨大表单所做的任何更改。加载页面时,我会创建一个JS对象,该对象“捕获”所有输入字段(选择、单选按钮、复选框等)的初始状态。当用户更改字面上数百个输入元素中任何一个的值时,新值会在第二个对象中跟踪。当用户单击更新时,将比较这两个对象,并仅发送已更改的值,以相应地更新数据 我认为使用继承比构建两个完全独立的对象更明智: var initialState = getInitialState();//eg:{bar:'1',foo:'bar',atom:'bom

好的,我正在尝试跟踪对web应用程序上的巨大表单所做的任何更改。加载页面时,我会创建一个JS对象,该对象“捕获”所有输入字段(选择、单选按钮、复选框等)的初始状态。
当用户更改字面上数百个输入元素中任何一个的值时,新值会在第二个对象中跟踪。当用户单击更新时,将比较这两个对象,并仅发送已更改的值,以相应地更新数据

我认为使用继承比构建两个完全独立的对象更明智:

var initialState = getInitialState();//eg:{bar:'1',foo:'bar',atom:'bomb',some:{nested:'objects'}}
var tracker = Object.create(initialState);
随着时间的推移,
跟踪器
对象可能最终看起来像这样:

{bar:'0',foo:'bar',atom:'peace',some:{nested:'objects'}}
在FF和chrome中对该对象调用
JSON.stringify
时,一切正常:只返回对象自己的属性。IE中并非如此:跟踪器没有
prototype
属性,因此似乎
对象。create
创建副本而不是继承链?
tracker.\uu proto\uu==initialState
返回true,而
tracker.prototype==initialState
的计算结果为false,实际上,
tracker.prototype
属性未定义

问题1:有没有其他方法可以在IE中建立一个继承链,允许我剥离未更改的原型值

问题2:如果可能的话,我还想要一个方法来建立一个允许嵌套对象的继承链。现在,嵌套对象是通过使用递归函数在主对象上迭代来处理的。有点傻,因为这正是我想忽略的

简而言之:
我想知道这是否存在:

var a = {bar:'1',foo:'bar',atom:'bomb',some:{nested:'objects'}};
var b = Object.magicDeepCreate(a);//<=== preferably X-browser
b.bar = '0';
b.bar.some.nested = 'stuff';
console.log(JSON.stringify(b));
//{"bar":"0","some":{"nested":"stuff"}}
vara={bar:'1',foo:'bar',atom:'bomb',some:{nested:'objects'};
var b=Object.magicDeepCreate(a)//
tracker.\uu proto\uu===initialState
返回true,而
tracker.prototype===initialState
的计算结果为false,事实上,
tracker.prototype
属性未定义


该产品为非标准产品,仅限FF。要获取对象的原型对象,请使用。函数对象的
prototype
属性是一个属性,它引用该函数的所有实例(使用
new
创建)从中继承的对象

在IE中并非如此

在IE8中根本不支持。您使用的是通用垫片还是自动失效?或者您甚至使用了一个真正复制所有属性的函数

Object.magicDeepCreate(a)
,最好是X浏览器

这应该很简单,假设所有目标浏览器都实现了
对象。create

Object.deepCreate = function deepCreate(o) {
    var res = Object.create(o);
    for (var i in o)
        if (Object.hasOwnProperty(o, i) && typeof o[i] == "object")
             res[i] = deepCreate(o[i]);
    return res;
};
仅将已更改的字符串化

这应该是
JSON.stringify
的标准行为-不考虑原型对象

但是,我不确定为什么您需要为
跟踪器
对象继承。只需使用一个空对象,并添加所有已更改的属性。如果您想删除那些已重置为初始状态的对象,可以将其存储在一个额外的对象中进行比较,但没有理由继承。只需使用:

Object.emptyStructure = function s(o){
    var res = {};
    for (var i in o)
        if (typeof o[i] == "object")
            res[i] = s(o[i]);
    return res;
};
var initialState = getInitialState();
var tracker = Object.emptyStructure(initialState);

// set:
if (newVal == initialState.some.nested)
    delete tracker.some.nested;
else
    tracker.some.nested = newVal;

实例化对象的
prototype
属性始终未定义<代码>\uuuu proto\uuuu
是一个。为什么不简单地将
change
事件处理程序绑定到输入字段并以这种方式跟踪更改?这就是我跟踪更改的方式,而不是检查
tracker.hasProperty(…)
数百次(记住:200多个输入也不例外)我宁愿只设置新的值,并仅对那些已更改的值进行字符串化。Hanks,您建议的
deepCreate
方法与我当前使用的方法类似,但仍然需要一个排序循环。有时让我感到困扰的是,JSON字符串包含各种各样的空格
{}
。我想使用继承,因为原始对象和跟踪器对象都遵循相同的结构,并且有4层深。不使用继承,正如我目前所做的,需要花费太多的精力和检查来构建IMO,然后还要进行更多的比较。我希望能有办法避免那些体力劳动。哦,我注意到DC的
Object.create()
是为IE8Hm定义的,那些空对象需要是-它们只说它们的属性没有改变,但它们仍然存在。谁是DC?问题不在于Object.create是否在IE8中实现,而在于它是如何实现的——它不是本机的。你能把函数打印出来吗?当然,为什么是道格拉斯·克罗克福德。。。下面是代码:
如果(!Object.create | | typeof Object.create!='function'){Object.create=function(o){function F(){};F.prototype=o;return new F();}
如果你想知道我正在处理的对象的规模,我可以在这里的某个地方提供一个小例子,好吧,那么它应该会起作用。如果您的JSON.stringify将原型考虑在内,那么该函数可能会出错?