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 如何有效地原型化阵列或从阵列到重用代码?_Javascript_Oop_Prototypal Inheritance - Fatal编程技术网

Javascript 如何有效地原型化阵列或从阵列到重用代码?

Javascript 如何有效地原型化阵列或从阵列到重用代码?,javascript,oop,prototypal-inheritance,Javascript,Oop,Prototypal Inheritance,我构建了一个解析器,我想“扩展”Array类以使用相同的函数,但在以下方面没有成功: Array.prototype = new Parser() 我想创建一个函数,该函数将重用阵列中的移位,而无需添加: function() { return this.list.shift() } 另外,我在这个标识方面遇到了一些问题,因此: 如何有效地原型化阵列或从阵列到重用代码 提前感谢。要扩展阵列,您需要扩展其原型,如下所示 function CustomArray() {} CustomArray

我构建了一个解析器,我想“扩展”Array类以使用相同的函数,但在以下方面没有成功:

Array.prototype = new Parser()
我想创建一个函数,该函数将重用阵列中的移位,而无需添加:

function() { return this.list.shift() }
另外,我在
这个
标识方面遇到了一些问题,因此:

如何有效地原型化阵列或从阵列到重用代码


提前感谢。

要扩展
阵列
,您需要扩展其原型,如下所示

function CustomArray() {}
CustomArray.prototype = Object.create(Array.prototype);
CustomArray.constructor = CustomArray;
CustomArray.prototype.newMethod = function() {...}
然后,您可以在
CustomArray
的原型上添加所有自定义方法,如下所示

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

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

首先,请参阅本文:

第二,您想扩展解析器来派生数组的方法,还是反之亦然?基本上,让解析器从数组中派生方法是可以的,但您的原型分配是错误的

Parser.prototype = [];
你是那样试的吗

关于您的
问题,发布的代码不完整,是吗

编辑:一些示例:

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

当我做
Parser.prototype=[]
时,这个
变成了一个窗口。使用
这个
是非常特别的
这是函数上下文中的一个特殊局部变量,仅在调用时声明。如果我使用Parser.prototype。那么我如何才能将[1,2,3,4]转换成新的解析器(1,2,3,4)。您的“构造函数”可能会使用
参数
使用push()将其所有元素推送到数组中。。。虽然没有性能,但对于这种语法糖来说已经足够了。在这里提供之前,在Google Chrome中尝试了上面的第二个示例。此时此刻再次尝试了NodeJS。它在这两种情况下都能工作,这次我能够附加
c.shift()四次给我
1
2
3
未定义的
。。。因此,它正在发挥作用。你在什么环境下工作?您的测试引擎/浏览器是什么?虽然这会将数组方法添加到自定义对象中,但不会使其行为类似于数组。例如,使用属性分配,如
obj[3]=42不会增加“自定义数组”的长度。我只是想说清楚。