在JS (实际上是TypeScript)和.NET w/ protobuf.js之间来回发送对象时,我希望仅在运行时(例如WebGL上下文、句柄等)修饰JS对象w/字段。添加一个新的动态字段很简单:
ReceivedObject.RuntimeField = new RuntimeField();但是,当序列化回服务器时,protobuf.js会发现新字段并引发异常。
我发现我可以通过将下面的三行直接添加到protobuf.js中来破解这个问题:
MessagePrototype.set = function (keyOrObj, value, noAssert) {
if (keyOrObj && typeof keyOrObj === 'object') {
noAssert = value;
for (var ikey in keyOrObj)
if (keyOrObj.hasOwnProperty(ikey) && typeof (value = keyOrObj[ikey]) !== 'undefined') {
if (ikey == "RuntimeField") { // added
continue; // added
} // added
this.$set(ikey, value, noAssert);
}
return this;
}
...
}这当然不是很容易维护。有没有更好的方法?对象层次结构既丰富又深入,因此我希望避免大量地将字段复制到/从自定义JS端对象。
谢谢你的建议。
发布于 2015-04-28 13:04:17
我为你树立了一个简短的榜样。您可以使用Object.defineProperty来添加一个不可枚举的属性来解决这个问题(当您使用for (var key in obj)时不会出现这个问题)。
在下面的示例中,first属性是可枚举的(并且将与name属性一起出现在控制台窗口中)。second属性不可枚举,因此它不会出现在控制台窗口中。
使用此技术,您可以添加不会在for循环中获取的属性。
var obj = {
name: 'Steve'
};
Object.defineProperty(obj, 'first', {
enumerable: true,
value: 'example'
});
Object.defineProperty(obj, 'second', {
enumerable: false,
value: 'example'
});
for (var key in obj) {
if (obj.hasOwnProperty(key)
&& typeof (value = obj[key]) !== 'undefined') {
console.log(key);
}
}为了把这个和你的具体问题联系起来,你可以.
Object.defineProperty(ReceivedObject, 'RuntimeField', {
enumerable: false,
value: new RuntimeField()
});https://stackoverflow.com/questions/29830408
复制相似问题