-3

我有 BookingOrder 类,它是主容器类,我在主容器中有诸如 PickAddress 之类的嵌套类。

如果我们启动一个 BookingOrder 类型的对象,然后我们为 PickupAddress.EnteredAddress 属性分配一个值,然后我们再次尝试启动另一个 BookingOrder 对象,我们会发现这个新对象中的 PickupAddress.EnteredAddress 具有旧值,为什么它没有再次启动。

  1. 点击按钮
  2. 它将调用填写订单函数,我将填写 o.PickupAddress.EnteredAddress。
  3. 再次单击该按钮。
  4. 它将调用填充订单函数并启动新的 bookingorder() ,但它会提醒您 o.PickupAddress.EnteredAddress 具有 value 。

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

 <!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>

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

4

1 回答 1

1

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

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

    }

现在,对构造函数的每次调用都将确保每个实例都有自己的“PickupAddress”属性和自己的不同值(一个对象)。

于 2013-10-02T18:37:40.267 回答