Javascript中的复杂对象
我有BookingOrder类,它是主容器类,我在主容器中有像PickAddress这样的嵌套类 如果我们启动BookingOrder类型的对象,则为PickupAddress.EnteredAddress属性分配一个值,然后我们再次尝试启动BookingOrder类型的另一个对象,我们将找到 此新对象中的PickupAddress.EnteredAddress具有旧值,原因是它不能再次启动Javascript中的复杂对象,javascript,prototype-programming,Javascript,Prototype Programming,我有BookingOrder类,它是主容器类,我在主容器中有像PickAddress这样的嵌套类 如果我们启动BookingOrder类型的对象,则为PickupAddress.EnteredAddress属性分配一个值,然后我们再次尝试启动BookingOrder类型的另一个对象,我们将找到 此新对象中的PickupAddress.EnteredAddress具有旧值,原因是它不能再次启动 点击按钮 它将调用fill order函数,我将填充o.PickupAddress.EnteredAdd
<!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这就是语言的工作方式。作为特性值嵌套在原型上的那些对象将由所有实例共享。不知何故,你必须复制它们。谢谢你的回答再次查看我的帖子