Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/452.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript中的复杂对象_Javascript_Prototype Programming - Fatal编程技术网

Javascript中的复杂对象

Javascript中的复杂对象,javascript,prototype-programming,Javascript,Prototype Programming,我有BookingOrder类,它是主容器类,我在主容器中有像PickAddress这样的嵌套类 如果我们启动BookingOrder类型的对象,则为PickupAddress.EnteredAddress属性分配一个值,然后我们再次尝试启动BookingOrder类型的另一个对象,我们将找到 此新对象中的PickupAddress.EnteredAddress具有旧值,原因是它不能再次启动 点击按钮 它将调用fill order函数,我将填充o.PickupAddress.EnteredAdd

我有BookingOrder类,它是主容器类,我在主容器中有像PickAddress这样的嵌套类

如果我们启动BookingOrder类型的对象,则为PickupAddress.EnteredAddress属性分配一个值,然后我们再次尝试启动BookingOrder类型的另一个对象,我们将找到 此新对象中的PickupAddress.EnteredAddress具有旧值,原因是它不能再次启动

  • 点击按钮
  • 它将调用fill order函数,我将填充o.PickupAddress.EnteredAddress
  • 再次点击按钮
  • 它将调用fill order函数并启动new bookingorder(),但它会提醒您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>
    
    
    函数BookingOrder(){}
    BookingOrder.prototype={
    “DriverLng”:空,
    “AccountName”:空,
    “副翻译”:假,
    “收件地址”:{
    “EnteredAddress”:空,
    “机构名称”:空,
    “地质点”:{“纬度”:0,“液化天然气”:0}
    },
    “投递地址”:{
    “EnteredAddress”:空,
    “机构名称”:空,
    “地质点”:{“纬度”:0,“液化天然气”:0}
    }
    };
    var o;
    函数FillOrder(){
    调试器;
    o=新预订订单();
    如果(o.PickupAddress.EnteredAddress!=null&o.PickupAddress.EnteredAddress!='')
    警报(“输入的地址不为空”);
    其他的
    o、 PickupAddress.EnteredAddress='Test 123'
    }
    
    这样做的最佳选择是:

    <!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>
    
    
    函数BookingOrder(){
    返回{
    “DriverLng”:空,
    “AccountName”:空,
    “副翻译”:假,
    “收件地址”:{
    “EnteredAddress”:空,
    “机构名称”:空,
    “地质点”:{“纬度”:0,“液化天然气”:0}
    },
    “投递地址”:{
    “EnteredAddress”:空,
    “机构名称”:空,
    “地质点”:{“纬度”:0,“液化天然气”:0}
    }
    };
    }
    var o;
    函数FillOrder(){
    调试器;
    o=新预订订单();
    如果(o.PickupAddress.EnteredAddress!=null&o.PickupAddress.EnteredAddress!='')
    警报(“输入的地址不为空”);
    其他的
    o、 PickupAddress.EnteredAddress='Test 123'
    }
    

    每次调用构造函数时,它都会返回新对象和所有嵌套对象,这些对象在不使用prototype的情况下再次启动,并再次清除构造函数中的所有值。

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

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

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

    谁能理解您所说的?你的问题和代码要更清楚。完全重复,或者我同意导言段落的措辞本可以更清楚,但是如果你看一下列举的对发生了什么的解释,这对我来说似乎完全可以理解。大家只要试试我的HTML,请注意,如果您第一次点击按钮,您将填写PickupAddress.EnteredAddress,再次尝试单击按钮,您将发现PickupAddress.EnteredAddress具有值,即使您再次初始化包含PickupAddress对象的预订订单。我将从将原型置于构造函数之外开始,然后尝试理解原型添加成员和实例特定成员之间的区别:这个答案的第一个代码示例可能会对此有所帮助:有没有其他方法可以做到这一点,因为我在这个主要的复杂对象中有很多复杂对象,所以我需要对每个复杂对象都这样做。@RoZaR这就是语言的工作方式。作为特性值嵌套在原型上的那些对象将由所有实例共享。不知何故,你必须复制它们。谢谢你的回答再次查看我的帖子