【问题标题】:Converting plain javascript hash into proper object将普通的 javascript 哈希转换为正确的对象
【发布时间】:2014-06-29 00:37:52
【问题描述】:

我需要为我的纯 JS 对象添加更多 OO 风格。基本上,我在服务器端有

class Superitem {
    List<Item> items;
    Whatever whatever;
}

class Item {
    List<Subitem> subitems;
    Whatever whatever;
}

class Subitem {
    List<Whatever> whatevers;
}

在客户端中,我得到一个作为普通 Javascript 哈希的超项,并希望将其转换为更好的东西。我开始喜欢

 Superitem(plain) {
      this.items = plain && plain.items || [];
      this.whatever = new Whatever(plain.whatever);
 }

但这太冗长了(我的真实课程更复杂),我相当怀疑它是否值得付出努力。我不是想在 Javascript 中模仿 Java,只是想添加一些有用的方法。有没有更好的办法? $.extend 之类的东西在这里似乎没用。

【问题讨论】:

    标签: javascript oop


    【解决方案1】:

    $.extend 几乎没有用处。您可以像这样定义构造函数:

    function Superitem(data) {
        $.extend(this, { items: [] }, data);
        this.whatever = new Whatever(this.whatever);
    }
    

    $.extend 将首先将默认值 ({ items: [] }) 注入到 this 中,然后是提供给函数的普通对象。然后它将whatever 转换为Whatever

    【讨论】:

    • 这听起来不错,只是在后面的步骤中我可能会混淆原始的data(可能在某处需要)。我想一开始就对data 做一个深拷贝可以解决它。
    • @maaartinus:请注意,通过结构,将所有内容转换为您的类之一的实例深层副本。在这种情况下,由于我们没有接触items,除了把它带过来,它不是深拷贝,但由于我们接触了whatever,所以改变它不会影响原来的data
    • 是的,但这假设我没有忘记任何事情。下一步我必须做类似var self = this; $.each(self.items, function(i,v) {self.items[i] = new Item(v);} 的事情,对吧?并检查hasOwnProperty,对吗?
    • @maaartinus:确实,它假设您不会忘记任何事情。先做一个深拷贝会更安全。举个例子:你需要使用map 而不是$.each。如果您将if(!(this isinstance Item)) return new Item(data); 放在Item 定义的顶部,则可以将该行重写为this.items = this.items.map(Item);。如果您提供默认值,我看不到 hasOwnProperty 的来源。
    • 我提到hasOwnProperty是因为$.eachiterating over everything,我不想添加任何垃圾。
    【解决方案2】:

    Object hashes 正如你所说的,are 已经是常规的、普通的对象了。

    如果您尝试合并多个属性/方法,jQuery 的 extend 方法可以工作,但它不是必需的。

    // Create an object through JSON, just to show its a regular
    // object.
    var obj = JSON.parse('{"prop" : true}');
    obj.method = function() {alert(this.prop)};
    
    obj.method();
    

    【讨论】:

    • 但我不想将方法直接添加到所有实例中。由于方法混淆了内容,这使得调试变得更糟。
    • 那么您必须更新您的问题并让我们知道您正在尝试添加方法的内容。
    • 到原型。这就是为什么我需要通过构造函数来创建对象……至少我是这么认为的。抱歉不准确。
    猜你喜欢
    • 2017-04-04
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    • 2016-11-19
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多