es6 对象的 getter、setter 和函数不适用于远程过程调用 (zerorpc)

Posted

技术标签:

【中文标题】es6 对象的 getter、setter 和函数不适用于远程过程调用 (zerorpc)【英文标题】:es6 object's getters, setters, and functions don't work with remote procedure calls (zerorpc) 【发布时间】:2016-07-18 14:33:26 【问题描述】:

我有以下课程。

class User 

    constructor( username )
    
        this._username = username;  
    

    get username()
    
        return this._username;
    

当我实例化一个用户对象并通过网络发送它时,它说当我尝试在接收端访问它时myUserObject.username 未定义,但myUserObject._username 确实包含我在发送端设置的值。我正在使用基于 zeromq 和 messagepack 的 zerorpc。有什么我可以添加或做不同的事情来完成这项工作吗?普通类函数也会出现此问题。 现在,我的临时解决方案是通过将有缺陷的对象传入构造函数并重新分配字段来在接收端重新创建对象。

发件人:

import User from './User.js'
const client = new zerorpc.Client();

//code for client to connect

function createUser()

    let user = new User( "kacy" );
    console.log( user.username ); //kacy
    client.invoke( 'createUser', user, someCallback );

接收者:

import User from './User.js'

createUser( user )

    console.log( user._username ); //kacy
    console.log( user.username ); //undefined
    let user2 = new User( user._username );
    console.log( user2.username ); //kacy

【问题讨论】:

【参考方案1】:

zerorpc 不会通过网络发送代码。 username() 是一个函数,不会通过网络发送,而_username 是一个属性。 zerorpc 可以发送任何类似 json 的数据类型,不多也不少。

我能想到这个限制背后的几个原因:

发送代码是安全风险的捷径(实际上是远程代码注入) 代码与惰性数据相比具有挑剔的行为,这使得以非常微妙的方式破坏客户端/服务器之间的契约变得更加容易 跨语言发送代码绝对不容易(因为 zerorpc 旨在成为多语言)。这需要一种通用的解释语言(例如lua)。 如果您不担心后果,请随时以文字形式发送代码,并在另一边 eval()

【讨论】:

以上是关于es6 对象的 getter、setter 和函数不适用于远程过程调用 (zerorpc)的主要内容,如果未能解决你的问题,请参考以下文章

学习es6 setter/getter研究

es6 getter setter

有没有办法让算术运算符在 Javascript ES6 中使用 getter 和 setter?

Javascript,扩展 ES6 类 setter 将继承 getter

Vuex 语法错误与 localcomputed 函数结合 getter 和 setter

JS中的getter和setter