模拟javascript的数组方法。Stoyan Stefanov的面向对象Javascript

模拟javascript的数组方法。Stoyan Stefanov的面向对象Javascript,javascript,Javascript,我偶然发现了Stoyan Stefanov的《面向对象Javascript》一书。下面有一个练习 练习:想象数组()不存在,数组文字符号也不存在 任何一个创建一个名为MyArray()的构造函数,其行为与 尽可能使用数组() 我已经管理了这么多,但推不起作用。有人能带我到这里吗 function MyArray() { var arg = arguments; this.toString = function () { var string = arg[0];

我偶然发现了Stoyan Stefanov的《面向对象Javascript》一书。下面有一个练习

练习:想象数组()不存在,数组文字符号也不存在 任何一个创建一个名为MyArray()的构造函数,其行为与 尽可能使用数组()

我已经管理了这么多,但推不起作用。有人能带我到这里吗

function MyArray() {
    var arg = arguments;
    this.toString = function () {
        var string = arg[0];
        for (var i = 1; i < arg.length; i++) {
            string += "," + arg[i];
        }
        return string;
    }
    this.length = arg.length;
    this.push = function(p) {
        var a = this.toString() + ",";
        arg[this.length] = p;
        return a.concat(p);
    }
    this.pop = function() {
        return arg[this.length - 1];
    }
    this.join = function (j) {
        var strJoin = arg[0];
        for (var i = 1; i < arg.length; i++) {
            strJoin += j + arg[i];
        }
        return strJoin;
    }
}

var a = new MyArray(1, 2, 3, "test");
console.log(a.toString()); // 1,2,3,test 
console.log(a.length); // 4
console.log(a.push('boo')); // should return 5
console.log(a.toString()); // should return 1,2,3,test,boo
console.log(a.pop()); // boo
console.log(a.join(',')); // 1,2,3,test
console.log(a.join(' isn\'t ')); // 1 isn't 2 isn't 3 isn't test
函数MyArray(){
var arg=参数;
this.toString=函数(){
变量字符串=arg[0];
对于(变量i=1;i

JSFIDLE:

以下是您的推送和弹出的固定实现:

this.push = function() {
    // edit - push needs to accept more than one new item.
    for (var i = 0; i < arguments.length; i++) {
        arg[arg.length++] = arguments[i];
    }
    return arg.length;
}
this.pop = function() {
    return arg[--arg.length];
}
this.push=function(){
//编辑-推送需要接受多个新项目。
for(var i=0;i
小提琴:


另一方面,我认为使用arguments对象(类似于数组)作为内部数据存储可能有点欺骗。

为什么在
推送中对
进行字符串化?为什么直接使用参数?我相信作者在这里的意思是让你创建一个LinkedList或一些类似的数据结构。你的
pop
实际上是
peek
。。。简而言之,您一直忽略更新
length
属性。可能是@JanDvorak的重复:我不知道该怎么做。你能带我到这里吗?谢谢,伙计。就是我要找的代码。另外,我认为使用arguments对象(类似于数组)作为内部数据存储可能有点欺骗。我不应该使用它?你基本上是把你自己的类连接到arguments对象上,它已经支持按索引访问,并且有一个length属性。显然,这是解决问题的最简单的方法,而且实际上并不违反规则。。。所以我想没关系。