模拟数组对象

时间:2012-07-02 21:01:26

标签: javascript

面向对象的JavaScript书中的问题: Imagine Array()不存在,并且数组文字表示法也不存在。创建一个名为MyArray()的构造函数,其行为尽可能接近Array()。

我认为测试我的技能将是一个很好的挑战。这就是我想出来的,但它不起作用而且非常不完整..我有点难过:

function MyArray(){

// PRIVATE FIELDS -----------------------

var initialData = arguments;
var storage;

// PRIVATE METHODS ----------------------

function refresh(){ //this doesn't work :(
    for(var i = 0; i < storage.length; i++){
        this[i] = storage[i]
    }
};

function initialize(){
    storage = initialData;
    refresh();
}

function count(){
    var result = 0;
    for(var item in this){
        //console.log(item, parseInt(item), typeof item);
        if(typeof item == 'number'){
            result++;
        }
    }
    return result;
};

initialize();

// PUBLIC FIELDS -------------------------

this.length = count();

// PUBLIC METHODS ------------------------

//todo:
this.push = function(item){
    refresh();
}

this.pop = function(){}

this.join = function(){}

this.toString = function(){}

}

var c = new MyArray(32,132,11);

console.log(c, c.length);

这不适用于任何生产代码或任何项目..只是为了尝试更多地学习JavaScript。有人可以试着帮我这个代码吗?

4 个答案:

答案 0 :(得分:2)

问题是你可以使用arguments对象。它不是使用Array()创建的数组,因此您不会破坏练习的规则。这是你需要做的:

this.length = 0;
for (var i in arguments) {
   this[this.length] = arguments[i];
   this.length++;
}

我忘了提到任何对象都是一个关联数组,所以为练习应用关联数组并不是错误的,因为我们不使用Array()对象本身。

问题的作者:在您的示例中,您使用:此[“i”] =存储[i] 等于 this.i = storage [i] 。尝试删除引号并将其用作 this [i] = storage [i]

答案 1 :(得分:0)

for(var item in this){
    if(typeof item == 'number')

属性名称始终是字符串。您需要检查它是否是从0到MaxArrayLength的数字的字符串表示形式。你可以做例如

for (var i=0; i<4294967296; i++)
    if (i in this)
         result = i;

您可能也对these articlesofficial specification for Array behaviour感兴趣。

答案 2 :(得分:0)

我目前正在浏览这本书,我可能应该尝试一些更新的东西,但它还没有过时,而且校长仍然合理......我认为它们很好。

无论如何,我选择了一个稍微不同的解决方案,尽管我从操作系统中获取了灵感来解决他是如何处理字符串的。我认为这个练习的挑战不是创造更多阵列......否则......这是一个疯狂的挑战,特别是对于刚接触该语言的人。

var MyArray = function () {
    var args = arguments;
    var length = 0;
    for each(var item in args) {
        this[length++] = item;
     }
    this.toString = function () {
    var result = args[0];
    for (var i = 1; i < args.length; i++) {
        result += ',' + args[i];
    }
    return result;
    }
  this.length = length;
  this.push = function (push) {
      var newLength = args.length++;
      args[newLength] = push;
      this[newLength] = push;
      return ++length;
  }
  this.pop = function () {
      delete args[--args.length];
      delete this[args.length];
      length--;
      return args;
  }
  this.join = function(joiner){
      if(typeof arguments[0] === "undefined"){
          joiner = ',';
      }
      var result = args[0];
      for (var i = 1; i < args.length; i++) {
          result += joiner + args[i];
      }
      return result;
  }
}
var a = new MyArray(1, 2, 3, 'test');
console.log(a.toString());
console.log(a[a.length - 1]);
console.log(a.push('boo'));
console.log(a.toString());
console.log(a.pop());
console.log(a.toString());
console.log(a.join(','));
a.join(' isn\'t ');

答案 3 :(得分:0)

我的解决方法是:

 function MyArray() {
    this.length = 0;

    for(i = 0; i < arguments.length; i++) {
        this[this.length] = arguments[i];
        this.length++;
    }
    this.toString = function(joiner = ',') {
        let str = this[0] ? this[0] : '';
        for(i=1;i<this.length; i++) {
            str+= joiner + this[i];
        }
        return str;
    };
    this.push = function(value) {
        this[this.length++] = value;
        return this.length;
    };
    this.pop = function() {
        let value = this[this.length -1];
        delete this[--this.length]
        return value;
    };
    this.join = function(joiner) {
        return this.toString(joiner);
    }
}