【发布时间】:2011-02-02 01:06:18
【问题描述】:
我刚刚开始使用原型构造函数实例化 JavaScript 对象字面量,但对适用于我的案例的继承/反射规则有点困惑。
基本上我的问题是原型化的原始对象有几层属性/值:
var protoObj = {
prop1: {
first : 1,
second : 2,
third : {
a : 'foo',
b : 'bar',
c : {
'love': true,
'babies': false,
'joy': undefined
}
}
},
prop2 : true
};
...在所有子对象中,除了少数这些属性之外,所有属性都将保持不变(并且应该动态更新)。
我可以在不影响原始原型对象的情况下为子对象更新或创建新的顶级属性:
if (typeof Object.create !== 'function') {
Object.create = function(o){
var F = function(){};
F.prototype = o;
return new F();
};
}
var someObj = Object.create(protoObj);
someObj.prop2 = false;
//protoObj.prop2 remains true
someObj.prop3 = [x,y,z];
//new property, unique to someObj (i.e. protoObj remains untouched)
但是,如果我想为 someObj 中根深蒂固的属性 'joy' 设置一个唯一值,我似乎无法在不重新定义 protoObj 本身或破坏 someObj 的委托链的情况下这样做回到它的原型:
someObj.prop1.third.c['joy'] = 'found';
//does not *directly* update someObj
//instead ends up setting the value of protoObj's property 'joy' to be 'found'
someObj.prop1 = {
first : 1,
second : 2,
third : {
a : 'foo',
b : 'bar',
c : {
'love': true,
'babies': false,
'joy': 'found'
}
}
};
//explicitly sets the above values in someObj.prop1 (including 'joy'), but breaks
//the prototypal link back to protoObj for all data in someObj.prop1 as well
我怀疑我要么忽略了一个非常简单的解决方案,要么完全不走运,但无论如何我都非常有义务听取大家的意见。提前致谢。
【问题讨论】:
-
你能提供从 protoObj 产生 someObj 的代码吗?事实上,你如何制作所有这些东西的原型?
-
@Pierre - 在第二个代码块中更新。
-
他不需要改变任何东西,他的问题很清楚。问题是他的原型包含对一个对象的引用,因此对该对象的更改将在该类的所有实例中可见。
-
我很确定你完全不走运。
标签: javascript object prototype