我构建了一个解析器,我想'扩展'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);
}
}
提前致谢。
答案 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