2013-10-02 176 views
-3

我有BookingOrder类,它是主容器类,我在主容器中嵌套了像PickAddress这样的类。Javascript中的复杂对象

如果我们启动类型BookingOrder的对象,然后我们分配PickupAddress.EnteredAddress属性的值,然后我们再尝试启动BookingOrder的另一个目的,我们将在这个新的对象找到 PickupAddress.EnteredAddress有旧值,它为什么不再次启动。

  1. 单击按钮
  2. 它会调用填写以下功能,我将填补o.PickupAddress.EnteredAddress。
  3. 再次点击按钮。
  4. 它会调用填充顺序函数并启动新的订单顺序(),但它会提醒您o.PickupAddress.EnteredAddress具有值。

我需要知道为什么会发生这种情况以及我应该如何启动主复杂对象中的所有对象。

<!DOCTYPE html> 
    <html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
     <title></title> 
     <script> 
      function BookingOrder() { } 
      BookingOrder.prototype = { 
       "DriverLng": null, 
       "AccountName": null, 
       "ParaTransit": false, 
       "PickupAddress": { 
        "EnteredAddress": null, 
        "EstablishmentName": null, 
        "GeoPoint": { "lat": 0, "lng": 0 } 
       }, 
       "DropoffAddress": { 
        "EnteredAddress": null, 
        "EstablishmentName": null, 
        "GeoPoint": { "lat": 0, "lng": 0 } 
       } 
      }; 
      var o; 
      function FillOrder() { 
       debugger; 
       o = new BookingOrder(); 
       if (o.PickupAddress.EnteredAddress != null & o.PickupAddress.EnteredAddress != '') 
        alert('Entered Address is not empty'); 
       else 
        o.PickupAddress.EnteredAddress = 'Test 123' 
      } 
     </script> 
    </head> 
    <body> 
     <input type="button" onclick="FillOrder()" /> 
    </body> 
    </html> 

这样做,像这样是最好的选择:

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <title></title> 
    <script> 
     function BookingOrder() { 
      return { 
       "DriverLng": null, 
       "AccountName": null, 
       "ParaTransit": false, 
       "PickupAddress": { 
        "EnteredAddress": null, 
        "EstablishmentName": null, 
        "GeoPoint": { "lat": 0, "lng": 0 } 
       }, 
       "DropoffAddress": { 
        "EnteredAddress": null, 
        "EstablishmentName": null, 
        "GeoPoint": { "lat": 0, "lng": 0 } 
       } 
      }; 
     } 

     var o; 
     function FillOrder() { 
      debugger; 
      o = new BookingOrder(); 
      if (o.PickupAddress.EnteredAddress != null & o.PickupAddress.EnteredAddress != '') 
       alert('Entered Address is not empty'); 
      else 
       o.PickupAddress.EnteredAddress = 'Test 123' 
     } 
    </script> 
</head> 
<body> 
    <input type="button" onclick="FillOrder()" /> 
</body> 
</html> 

在每次调用构造函数将返回全新的对象和所有再次发起嵌套的对象,而无需使用原型,并清除所有的值再次在构造函数中。

+3

........... what –

+0

怎么能有人明白你在说什么?更清楚您的问题和代码。 –

+0

[Crockford的Prototypal继承 - 嵌套对象的问题]的确切副本[JavaScript原型继承 - 共享属性](http://stackoverflow.com/questions/10131052/crockfords-prototypal-inheritance-issues-with-nested-objects) (http://stackoverflow.com/questions/15449838/javascript-prototype-in​​heritance-shared-property) – Bergi

回答

1

当您引用“PickupAddress”对象时,您始终指向相同的对象。如果你需要为每个实例刷新,你必须在构造函数中设置它。

function BookingOrder() { 
     this.PickupAddress = { 
      "EnteredAddress": null, 
      "EstablishmentName": null, 
      "GeoPoint": { "lat": 0, "lng": 0 } 
     }; 

    } 

现在每次调用构造函数将确保每个实例有自己的“PickupAddress”以其独特的价值(对象)属性。

+0

是否有另一种方法来做到这一点,因为我在这个主要的复杂对象中有很多复杂的对象,所以我需要为每个复杂的对象执行此操作。 – RoZaR

+0

@RoZaR这只是语言的工作方式。那些作为属性值嵌套在原型上的对象将被所有实例共享。不知何故,你必须复制它们。 – Pointy

+0

谢谢你的回答再次检查我的文章 – RoZaR