我如何有效地原型Array或从Array重用代码?

时间:2014-04-14 14:16:33

标签: javascript oop prototypal-inheritance

我构建了一个解析器,我想'扩展'Array类,以便使用相同的函数但是没有成功:

Array.prototype = new Parser()

我想创建一个函数来重用数组的转换,而不必添加:

function() { return this.list.shift() }

此外,我对this身份也存在一些问题:

  

如何有效地对Array或Array进行原型设计以重用代码?

function Parser() {
  this.get_info_colors = function() {
    return {
      'id': self.shift(),
      'name': self.shift(),
      'colors': self.get_colors()
    }
  }
  this.get_info_grad = function() {
    return {
      'id': self.shift(),
      'name': (self.shift() + '_grad'),
      'grad': self.shift()
    }
  }
  this.get_colors = function() {
    this.shift();
    var result = [],
        element;
    while(element != ']') {
      element = this.shift();
      result.push();
    }
    return element;
  }
  this.builder = function(factory) {
    this.shift();
    var result = [],
        element;
    while(element != ']') {
      result.push(factory());
    }
    return result;
  }
  this.color_builder = function() {
    return this.builder(this.get_info_colors);
  }
  this.grad_builder = function() {
    return this.builder(this.get_info_grad);
  }
}

提前致谢。

3 个答案:

答案 0 :(得分:1)

要扩展Array,您需要扩展其原型,如此

function CustomArray() {}
CustomArray.prototype = Object.create(Array.prototype);
CustomArray.constructor = CustomArray;

然后您可以在CustomArray的原型上添加所有自定义方法,例如

CustomArray.prototype.newMethod = function() {...}

答案 1 :(得分:1)

我使用Array.prototype.parser = function(){ // your parser }

答案 2 :(得分:1)

首先,请看这篇文章:

Why is extending native objects a bad practice?

其次,您是否希望扩展Parser以获取Array的方法,反之亦然?基本上,让Parser从Array派生方法是可以的,但是你的原型赋值是错误的。

Parser.prototype = [];

你有没有尝试过这种方式。

关于this的问题,已发布的代码尚未完成,是吗?

编辑:一些例子:

function Parser() { this.__a = 1; }
Parser.prototype = [];
var a = new Parser;
a.length
// gives 0
a.push( 2 );
// gives 1
a.length
// gives 1
a.__a
// gives 1

编辑2:使用评论中给出的构造函数的示例:

function Parser() { 
  var args = [].slice.call( arguments );
  args.unshift( 0 ); 
  args.unshift( 0 ); 
  [].splice.apply( this, args ); 
}

Parser.prototype = [];

var c = new Parser( 1, 2, 3 )
c.length
// gives 3