首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >强迫Protobuf.js忽略未识别的JS端字段。

强迫Protobuf.js忽略未识别的JS端字段。
EN

Stack Overflow用户
提问于 2015-04-23 17:24:06
回答 1查看 668关注 0票数 3

在JS (实际上是TypeScript)和.NET w/ protobuf.js之间来回发送对象时,我希望仅在运行时(例如WebGL上下文、句柄等)修饰JS对象w/字段。添加一个新的动态字段很简单:

代码语言:javascript
复制
ReceivedObject.RuntimeField = new RuntimeField();

但是,当序列化回服务器时,protobuf.js会发现新字段并引发异常。

我发现我可以通过将下面的三行直接添加到protobuf.js中来破解这个问题:

代码语言:javascript
复制
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端对象。

谢谢你的建议。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-28 13:04:17

我为你树立了一个简短的榜样。您可以使用Object.defineProperty来添加一个不可枚举的属性来解决这个问题(当您使用for (var key in obj)时不会出现这个问题)。

在下面的示例中,first属性是可枚举的(并且将与name属性一起出现在控制台窗口中)。second属性不可枚举,因此它不会出现在控制台窗口中。

使用此技术,您可以添加不会在for循环中获取的属性。

代码语言:javascript
复制
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);   
    }
}

为了把这个和你的具体问题联系起来,你可以.

代码语言:javascript
复制
Object.defineProperty(ReceivedObject, 'RuntimeField', {
  enumerable: false,
  value: new RuntimeField()
});
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29830408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档