Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/371.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 为什么通过函数将KinectJS对象从客户端传递到NodeJ会导致类丢失?_Javascript_Node.js - Fatal编程技术网

Javascript 为什么通过函数将KinectJS对象从客户端传递到NodeJ会导致类丢失?

Javascript 为什么通过函数将KinectJS对象从客户端传递到NodeJ会导致类丢失?,javascript,node.js,Javascript,Node.js,我正在使用KinectJS创建一个Kinect.Rect对象。我正在尝试将此对象从客户端传递到服务器。在客户端(在作为参数传递之前),console中对象的输出为: box_284 Kinetic.Rect alpha: 1 centerOffset: Object className: "Shape" drag: Object drawFunc: function (){ eventListeners: Object fill: "00D2FF" height: 25 isListening:

我正在使用KinectJS创建一个Kinect.Rect对象。我正在尝试将此对象从客户端传递到服务器。在客户端(在作为参数传递之前),console中对象的输出为:

box_284
Kinetic.Rect
alpha: 1
centerOffset: Object
className: "Shape"
drag: Object
drawFunc: function (){
eventListeners: Object
fill: "00D2FF"
height: 25
isListening: true
name: undefined
rotation: 0
scale: Object
stroke: "black"
strokeWidth: 4
visible: true
width: 25
x: 100
y: 100
__proto__: Object
发送后:

box
Object
alpha: 1
centerOffset: Object
className: "Shape"
drag: Object
eventListeners: Object
fill: "00D2FF"
height: 25
isListening: true
rotation: 0
scale: Object
stroke: "black"
strokeWidth: 4
visible: true
width: 25
x: 100
y: 100
__proto__: Object
KinectJS库可供客户端使用,这是一个“深度克隆”的问题吗?对象是如何传递的?是不是服务器无法使用该库的问题?不知道该怎么看..对Javascript来说还是个新问题

===============

更新 我的论点如下:

socket.emit('add_box', eval("box_" + id));

如果对象类似于:box_523

首先,我建议您通过某种数组或字典来访问对象,而不是使用
eval(“box_”+id)
。抛开任何潜在的安全问题,对数组进行索引将提供比
eval
更好的性能

为了抓住问题的核心,问题在于,
socket.emit
序列化和传输数据。由于
drawFunc
是一个函数而不是数据,因此它不会被传输

如果你仔细想想,这是一个相当简单的行为。如果你将一个函数跨线移动,预期的行为会是什么?它将在哪里执行?你会传输实际的JavaScript,然后在服务器上评估它吗

虽然这些都是您可以潜在地回答并开发自己的解决方案的问题,但它不是现成的


也就是说,您可能需要研究。它可能符合您的要求。但同样,它不会跨网络传输任何代码:

注意:代码仅在创建它的一侧执行, 这意味着函数体实际上没有被转移 从客户机到服务器,或者从服务器到客户机,只是一个垫片 用于同步时的远程函数调用。这非常重要 这对安全性很重要,因为它意味着永远不会有任意代码 在NowJS中执行


首先,我建议您通过某种数组或字典来访问对象,而不是使用
eval(“box”+id)

为了抓住问题的核心,问题在于,
socket.emit
序列化和传输数据。由于
drawFunc
是一个函数而不是数据,因此它不会被传输

如果你仔细想想,这是一个相当简单的行为。如果你将一个函数跨线移动,预期的行为会是什么?它将在哪里执行?你会传输实际的JavaScript,然后在服务器上评估它吗

虽然这些都是您可以潜在地回答并开发自己的解决方案的问题,但它不是现成的


也就是说,您可能需要研究。它可能符合您的要求。但同样,它不会跨网络传输任何代码:

注意:代码仅在创建它的一侧执行, 这意味着函数体实际上没有被转移 从客户机到服务器,或者从服务器到客户机,只是一个垫片 用于同步时的远程函数调用。这非常重要 这对安全性很重要,因为它意味着永远不会有任意代码 在NowJS中执行


如何发送?JSON序列化不包括类信息。我用这些信息更新了我的问题。也许有其他方法我应该尝试实现这一点吗?如何发送?JSON序列化不包括类信息。我用这些信息更新了我的问题。也许有其他方法我可以选择吗uld正在尝试实现这一点?谢谢Rohan,你能给我一个简单的例子,说明我如何使用数组或字典来实现eval('box_'+id)的功能吗?我不熟悉KinectJS,但以下是一般原则。初始化数组,
box=[]
。然后每次创建一个box时,都要执行
box。按下[myNewBox]
。然后,您应该能够使用,例如,
box[123]
访问任何框。感谢Rohan,您能给我一个简单的例子,说明如何使用数组或字典来完成eval('box_'+id)所需要的功能吗?我不熟悉KinectJS,但这里有一个一般原则。初始化数组,
box=[]
。然后每次创建框时,都要执行
box。按[myNewBox]
。然后,您应该能够使用例如
box[123]
访问任何框。