Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/437.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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 使用Jaxer时定义对象_Javascript_Oop_Aptana_Jaxer - Fatal编程技术网

Javascript 使用Jaxer时定义对象

Javascript 使用Jaxer时定义对象,javascript,oop,aptana,jaxer,Javascript,Oop,Aptana,Jaxer,我一直在玩,虽然这个概念很酷,但我不知道如何定义在客户端和服务器上都可用的对象。我找不到任何定义对象的示例 我希望能够定义一个对象,并指定哪些方法在服务器上可用,哪些方法在客户端可用,哪些方法在客户端可用但在服务器(服务器代理)上执行。不使用三个具有不同runat属性的单独标记,可以做到这一点吗?如果可能的话,我希望能够在同一个js文件中定义我的所有方法,而在html中用三个单独的标记内联定义我的对象是不现实的 基本上,我希望能够在一个js文件中实现这一点: function Person(na

我一直在玩,虽然这个概念很酷,但我不知道如何定义在客户端和服务器上都可用的对象。我找不到任何定义对象的示例

我希望能够定义一个对象,并指定哪些方法在服务器上可用,哪些方法在客户端可用,哪些方法在客户端可用但在服务器(服务器代理)上执行。不使用三个具有不同
runat
属性的单独
标记,可以做到这一点吗?如果可能的话,我希望能够在同一个js文件中定义我的所有方法,而在html中用三个单独的标记内联定义我的对象是不现实的

基本上,我希望能够在一个js文件中实现这一点:

function Person(name) {
    this.name = name || 'default';
}
Person.runat = 'both';

Person.clientStaticMethod = function () {
    log('client static method');
}
Person.clientStaticMethod.runat = 'client';

Person.serverStaticMethod = function() {
    log('server static method');
}
Person.serverStaticMethod.runat = 'server';

Person.proxyStaticMethod = function() {
    log('proxy static method');
}
Person.proxyStaticMethod.runat = 'server-proxy';

Person.prototype.clientMethod = function() {
    log('client method');
};
Person.prototype.clientMethod.runat = 'client';

Person.prototype.serverMethod = function() {
    log('server method');
};
Person.prototype.serverMethod.runat = 'server';

Person.prototype.proxyMethod = function() {
    log('proxy method');
}
Person.prototype.proxyMethod.runat = 'server-proxy';

另外,假设我能够做到这一点,我将如何将其正确地包含到html页面中?

我在Aptana论坛(不再存在于web上)上找到一篇帖子,其中指出只有全局函数可以代理。。。糟糕透了

但是,我一直在玩,您可以通过将代码放在include文件中并使用带有
runat
属性的
标记来控制客户端和服务器上可用的方法

例如,我可以创建名为
Person.js.inc
的文件:

<script runat="both">

    function Person(name) {
        this.name = name || 'default';
    }

</script>

<script runat="server">

    Person.prototype.serverMethod = function() {
        return 'server method (' + this.name + ')';
    };

    Person.serverStaticMethod = function(person) {
        return 'server static method (' + person.name + ')';
    }

    // This is a proxied function.  It will be available on the server and
    // a proxy function will be set up on the client.  Note that it must be 
    // declared globally.
    function SavePerson(person) {
        return 'proxied method (' + person.name + ')';
    }
    SavePerson.proxy = true;

</script>

<script runat="client">

    Person.prototype.clientMethod = function() {
        return 'client method (' + this.name + ')';
    };

    Person.clientStaticMethod = function (person) {
        return 'client static method (' + person.name + ')';
    }

</script>

职能人员(姓名){
this.name=name | |“默认值”;
}
Person.prototype.serverMethod=函数(){
返回“服务器方法('+this.name+');
};
Person.serverStaticMethod=函数(Person){
返回“服务器静态方法('+person.name+')”;
}
//这是一个代理函数。它将在服务器和服务器上可用
//将在客户端上设置代理功能。请注意,它必须是
//全球宣布。
函数SavePerson(person){
返回“代理方法('+person.name+')”;
}
SavePerson.proxy=true;
Person.prototype.clientMethod=函数(){
返回“客户端方法('+this.name+')”;
};
Person.clientStaticMethod=函数(Person){
返回“客户端静态方法('+person.name+')”;
}
我可以使用以下方法将其包含在页面上:

<jaxer:include src="People.js.inc"></jaxer:include>

不幸的是,使用这种方法,我失去了浏览器缓存客户端脚本的优势,因为所有脚本都是内联的。我能找到的避免该问题的唯一方法是将客户端方法、服务器方法和共享方法拆分为它们自己的js文件:

<script src="Person.shared.js" runat="both" autoload="true"></script>
<script src="Person.server.js" runat="server" autoload="true"></script>
<script src="Person.client.js" runat="client"></script>

在这一点上,我也可以将代理函数拆分成它们自己的文件

<script src="Person.proxies.js" runat="server-proxy"></script>

请注意,我在共享脚本和服务器脚本上使用了
autoload=“true”
,以便代理函数可以使用它们