是否可以在javascript中调用子方法?

时间:2012-12-17 10:19:53

标签: javascript methods

作为一项实验,我正在尝试围绕Number构建以下方法层次结构:

                                     Number
                                       |
                                       |
                                      pad()
                                       /\
                                      /  \
                                     /    \
                                    /      \
                                 left()   right()

确切地说,我希望left()right()成为pad()的子方法,这样我就可以通过拨打电话来填充数字:

var i = 100;
i.pad().left();

这是我正在研究的实验脚本:

/* 
    Javascript to pad zero's to a number at the left or right.
*/
Number.prototype.pad = function()
{
    Number.prototype.pad.left = function(l)
    {
        if(typeof l=='undefined') 
            l = 0;
        p = this+'';
        var r = l - p.length; 
        while((r--)>0)
            p = '0'+p;
        return p;
    }
    Number.prototype.pad.right = function(l)
    {
        if(typeof l=='undefined') 
            l = 0;
        p = this+'';
        var r = l - p.length; 
        while((r--)>0)
            p = p+'0';
        return p;
    }
}
i = 646;
padded = i.pad.left(9); /* Possible calling format*/
alert(padded); 

这在Javascript中如何实现?

3 个答案:

答案 0 :(得分:3)

问题已解决:
1)调用pad()而不是pad pad 2)Pad()返回带有左右成员的对象 3)最重要的是,'这个'在新功能中不起作用,因为它们不是数字的一部分。提取函数外的数字。
4)p无意中变得公开(window.p)。把var放在前面。

See it working

  Number.prototype.pad = function() {

    var number = this.valueOf();
    return {
      left: function(l)
      {
        console.log(this);
          if(typeof l=='undefined') 
              l = 0;
          var p = number + '';
          var r = l - p.length; 
          while((r--) > 0)
              p = '0'+ p;
          return p;
      },
      right: function(l)
      {
          if(typeof l=='undefined') 
              l = 0;
          var p = number + '';
          var r = l - p.length; 
          while((r--)>0)
              p = p+'0';
          return p;
      }
  }
}
i = 646;
padded = i.pad().left(9); /* Possible calling format*/
  alert(padded); 

答案 1 :(得分:1)

考虑更简单的事情。您可以将左右作为参数传递给pad。例如:

Number.prototype.pad = function( l,r ) {

  l = l || 0; r = r || 0;

  var arr = [ this ], 
      i = 0, j = 0;

  for ( ; i < l; ++i ) arr.unshift(0);
  for ( ; j < r; ++j ) arr.push(0);

  return arr.join('');

};

console.log( (12).pad(2,0) ); //=> 0012
console.log( (12).pad(0,1) ); //=> 120
console.log( (12).pad(3,2) ); //=> 0001200

这是一个更短的功能和简洁的代码片段:

Number.prototype.pad = function( l,r ) { 
  return this.toString()
    .replace( /\d+/, new Array( ++l ).join('0') +'$&'+
      new Array( ++r||0 ).join('0'));
}

答案 2 :(得分:0)

我的版本

Number.prototype.lpad = function( num ) {

    var padding = new Array( num + 1 ).join("0"),
    result = padding + this.toString( 10 );
    return result.slice( -num );
}

Number.prototype.rpad = function( num ) {

    var padding = new Array( num + 1 ).join("0"),
    result = this.toString( 10 ) + padding;
    return result.slice( 0, num );
}