JavaScript扩展Array并将方法添加到子原型?

时间:2013-03-11 15:57:33

标签: javascript arrays

我想创建一个类似于简单音乐播放列表(Array)的js类。我想用ID实例化这个播放列表,每个ID都是我数据库中的轨道ID。我有这样的界面:

function Playlist() {
    Playlist.prototype.current = 0;
    Playlist.prototype.prev = function() {
        if (this.current-1 < 0) {
            return null;
        }
        return this[--this.current];
    };
    Playlist.prototype.next = function() {
        if (this.current+1 >= this.length) { // length is index + 1
            return null;
        }
        return this[++this.current];
    };
    Playlist.prototype.seek = function(id) {
        for (i in this) {
            if (this[i] == id) {
                this.current = parseInt(i);
                return i;
            }
        }

        return false;
    };
    Playlist.prototype.getCurrent() {
            return this.current;
    };
};

上面的代码没有做我想要的,因为我把它想象为class,它有定义的方法,可以像这样实例化:

var newPlaylist = Playlist(2,3,5,10/* those are my ids */);

目前我找到的唯一方法就是:

Playlist.prototype = new Array(2, 3, 5, 10/* those are my ids */);

这没有任何意义,因为它可以被实例化为不同的对象。任何想法都非常受欢迎!

2 个答案:

答案 0 :(得分:2)

最佳方式 - 嵌套数组;

function Playlist() {
    this.current = 0;
    this.list = Array.prototype.slice.call(arguments);;
};

Playlist.prototype.prev = function() {
    if (this.current-1 < 0) {
        return null;
    }
    return this.list[--this.current];
};
Playlist.prototype.next = function() {
    if (this.current+1 >= this.list.length) { // length is index + 1
        return null;
    }
    return this.list[++this.current];
};
Playlist.prototype.getCurrent = function() {
    return this.current;
};

var newPlaylist = new Playlist(2,3,5,10/* those are my ids */);

但是你不能使用list [i]来逐个元素地获取元素,但你只需要在你的类中添加at()方法来提供类似的功能

PlayList.prototype.at(i) {
    return this.list[i];
}

答案 1 :(得分:1)

cannot subclass Array开始,您应该使用Playlist构造函数构建包装器对象:

Playlist = (function() {
    function Playlist(list) {
        this.list = list || [];
    }

    Playlist.prototype.current = 0;
    Playlist.prototype.prev = function() {
        if (this.current <= 0)
            return null;
        return this.list[--this.current];
    };
    Playlist.prototype.next = function() {
        if (this.current+1 >= this.length)
            return null;
        return this.list[++this.current];
    };
    Playlist.prototype.seek = function(id) {
        return this.list.indexOf(id);
    };

    return Playlist;
})();

用法:

var newPlaylist = new Playlist([2,3,5,10]);