Javascript - 代码结构

时间:2014-01-09 06:34:23

标签: javascript

假设存在:

Url = {}
Url.mk=function(u,n,v) { return {url:u, body:n+'='+v} }
Url.post=function(u) { /*does stuff*/ }

它曾在某个时候使用过:

Url.post( Url.mk('xyz.com', 'a', 1) )

和其他时候一样使用:

var u = Url.mk('xyz.com', 'a', 1);

是否可以创建toString()函数?所以你可以这样做:

console.log(  u.toString() ) //prints xyz.com?a=1

我很难尝试创建这样的原型,因为(我猜)var u只是一个对象文字而不是用new定义的对象。

有没有办法创建toString()函数而无需创建对象实例?还是有更好的方法?

请注意,我希望能够在函数参数和the var scope.

中使用任何方法

更新(获得答案后):

以下是任何人可能感兴趣的真实功能。我发现构建网址很麻烦,这些功能非常有用。这只是相关的功能,因为有更多的形式序列化,表单发布等等....

此功能解决的主要问题之一是始终添加我在app.hv中保存的CSRF令牌。

无论如何......现在已经很晚了,现在就是这样:

Url = {}
Url.objMk=function() {
var u = {
              url:  arguments[0], 
              body: 'ha=' + app.hv + '&cb_=' + parseInt(Math.random()*99999999),
              ha:    true,
              toString: function () { return this.url + '?' + this.body;}
    }
    for(var i=1; i<arguments.length; i++) 
      if (i % 2 != 0) u.body=u.body+"&"+arguments[i] + "="+encodeURIComponent(arguments[i+1]) 
    return u 
 }


Url.objReq=function() {
var u = {
          url: arguments[0] + "?request=" + encodeURIComponent(arguments[1]), 
      body: 'ha=' + app.hv + '&cb_=' + parseInt(Math.random()*99999999),
      ha: true,
          toString: function () { return this.url + '&' + this.body; } 
    }

    for(var i=2; i<arguments.length; i++)
       if (i % 2 == 0) u.body = u.body+"&"+arguments[i]+ "="+encodeURIComponent(arguments[i+1])              
    return u 
 }


Url.obj=function() {
   if (arguments.length % 2) 
      return Url.objMk.apply(this,arguments)
   else
      return Url.objReq.apply(this,arguments)
}

更新3

经过几个小时的睡眠后,我想出了让Url.obj()实际返回一个物体的方法。不确定是否有人正在阅读....无论如何,这是新版本。

这很酷,因为在使用Url.obj()时从不需要输入“new”

    Url.init = function(){
        this.url            = '' 
        this.body           = ''
        this.ha             = true
        this.nv             = function (n,v) { this.body = this.body + '&' + n + '=' + encodeURIComponent(v) } 
        this.toString = function ()    { return this.url + ((this.url.indexOf('?') == -1) ? '?':'&') + this.body } 
    }

    Url.objMk=function() {
        var u       = new Url.init()
        u.url       =   arguments[0]
        u.body  = 'ha=' + app.hv + '&cb_=' + parseInt(Math.random()*99999999)

        for(var i=1; i<arguments.length; i++) {
            if (i % 2 != 0) u.nv(arguments[i], arguments[i+1]) 
        }
        return u 
    }

    Url.objReq=function() {
        var u       = new Url.init();
        u.url       =   arguments[0] + '?request=' + encodeURIComponent(arguments[1])
        u.body  = 'ha=' + app.hv + '&cb_=' + parseInt(Math.random()*99999999)

        for(var i=2; i<arguments.length; i++) {
            if (i % 2 == 0) u.nv(arguments[i], arguments[i+1]) 
        }
        return u 
    }

    Url.obj=function() {
        if (arguments.length % 2) 
            return Url.objMk.apply(this,arguments)
        else
            return Url.objReq.apply(this,arguments)
    }

这样就可以通过3种不同的方式创建网址:

    var a = Url.obj('a.com', 'a');
    var b = Url.obj('b.com', 'b', 2);
    var c = Url.obj('c.com', 'c', 3, 'c2', 4).toString()

    var d = Url.obj('d.com')
    d.nv('dd', 55)
    d.nv('ee', 66)

    console.log(a.toString())
    console.log(b.toString())
    console.log(c)
    console.log(d.toString())

更新4

现在使用toString()的原型来节省内存使用量(以及执行操作)

    Url.init = function(p){
        this.url            = p    /// Url.path(p) // write if needed
        this.body           = 'ha=' + app.hv + '&cb_=' + parseInt(Math.random()*99999999)
        this.ha             = true
    }

    Url.init.prototype.toString = function(){ return this.url + ((this.url.indexOf('?') == -1) ? '?':'&') + this.body }
    Url.init.prototype.nv = function (n,v) { this.body = this.body + '&' + n + '=' + encodeURIComponent(v) } 

    Url.objMk=function() {
        var u       = new Url.init(arguments[0])
        for(var i=1; i<arguments.length; i++) {
            if (i % 2 != 0) u.nv(arguments[i], arguments[i+1])
        }
        return u 
    }

    Url.objReq=function() {
        var u       = new Url.init(arguments[0] + '?request=' + encodeURIComponent(arguments[1]))
        for(var i=2; i<arguments.length; i++) {
            if (i % 2 == 0) u.nv(arguments[i], arguments[i+1]) 
        }
        return u 
    }

    Url.obj=function() {
        if (arguments.length % 2) 
            return Url.objMk.apply(this,arguments)
        else
            return Url.objReq.apply(this,arguments)
    }

然后轻而易举地使用它:

    function U(){
        if (arguments.length % 2) 
            return Url.objMk.apply(this,arguments)
        else
            return Url.objReq.apply(this,arguments)
    }

用法ex:

var x = U('abc.html', 'aa', 33, 'bb', 55)
console.log(x.toString())

var x = U('abc.html', 'aa', 33, 'bb', 55)

    x.ajax( function(r){
      //ajax callback (not shown in here)  
    }) 

1 个答案:

答案 0 :(得分:2)

Url.mk=function(u,n,v) { return {url:u, body:n+'='+v, toString: function () { return this.url + '?' + this.body; } }

应该可以正常工作