将从 JSON 解析的对象绑定到类

发布于 2024-12-29 00:56:25 字数 1171 浏览 1 评论 0原文

我想从用 JSON 表示的 Web 服务中提取一组树形结构的对象。

当我解压它时,我将得到一个使用普通 Javascript 对象的结构。我希望能够做的是将每个节点绑定到特定的类,以便方法调用在树的每个节点上都可用。

我的解决方案,使用 jQuery .extend()

这是一个简化的示例,说明了该方法。

我可以使用 jQuery .extend() 定义一个简单的类,如下所示...

MyNode= function() {
  this.init();
}

$.extend(MyNode.prototype, {
   init: function() {
     // do initialization here
   },

   getName: function() {
     return this.nodeName;
   }
});

现在给出像这样的简单对象,

var tree={
    nodeName:'frumious',
    nodeType:'MyNode'
}

我可以使该对象看起来像是所需 nodeType 的实例,并

$.extend(tree, eval(tree.nodeType+'.prototype'));

注意我希望该对象声明类名,因此我使用 eval 来查找该类的适当原型。 (感谢Rob W建议< code>window[tree.nodeType].prototype 作为更好的选择)

现在我可以做类似 alert(tree.getName());

更好的方法了?

我写了 StackOverflow 问题,发现足够详细地描述它以避免否决的行为足以让我自己解决它。这也不例外,但我很想知道解决这个问题的任何更优雅的方法。这个解决方案完成了工作,但我忍不住觉得必须有其他方法......

I want to pull a tree structured set of objects from a web service represented with JSON

When I unpack that, I'll wind up with a structure which uses vanilla Javascript objects. What I'd like to be able to do is bind each node to a specific class, so that method calls become available on each node of the tree.

My solution, using jQuery .extend()

Here's a simplified example which illustrates the approach.

I might define a simple class using jQuery .extend() as follows...

MyNode= function() {
  this.init();
}

$.extend(MyNode.prototype, {
   init: function() {
     // do initialization here
   },

   getName: function() {
     return this.nodeName;
   }
});

Now given a simple object like this

var tree={
    nodeName:'frumious',
    nodeType:'MyNode'
}

I can make the object appear to be an instance of the desired nodeType with

$.extend(tree, eval(tree.nodeType+'.prototype'));

Note that I want the object to declare the class name, so I've used eval to locate the appropriate prototype for that class. (Thanks to Rob W for suggesting window[tree.nodeType].prototype as a better alternative)

Now I can do things like alert(tree.getName());

Better ways?

I write StackOverflow questions and find the act of describing it in enough detail to avoid a downvote is enough for me to solve it myself. This was no exception, but I'd be interested to hear of any more elegant approaches to this problem. This solution gets the job done, but I can't help but feel there must be other approaches...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

绳情 2025-01-05 00:56:25

我会摆脱eval,并使用:

$.extend(tree, window[tree.nodeType].prototype);

如果MyNode是本地但已知的变量,请将其添加到对象中以供参考。例如:

var collection = {};
collection['MyNode'] = MyNode;
$.extend(tree, collection[tree.nodeType].prototype);

或者,如果 JSON 的结构是可靠的,我建议使用自定义 JSON 解析器,它还允许您在添加之前验证属性。

I'd get rid off eval, and use:

$.extend(tree, window[tree.nodeType].prototype);

If MyNode is a local, but known variable, add it to an object, for reference. Eg:

var collection = {};
collection['MyNode'] = MyNode;
$.extend(tree, collection[tree.nodeType].prototype);

Alternatively, if the structure of the JSON is solid, I recommend a custom JSON parser, which also allows you to validate properties prior addition.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文