面试题,求解答

定义一个列表类 List,该类包含成员方法 add()all() 和属性 length,要求构造函数和 add() 方法的参数为动态参数

// 构造函数示例:
var ls = new List('A', 'B', 'C');
// add方法示例:
ls.add('D', 'E');
// length属性
ls.length; // => 5
// items属性
ls.all(); // => ['A', 'B', 'C', 'D', 'E']

这里主要的问题是length属性怎样实现,其它的方法都挺容易实现。求大神解答。

已经实现的代码如下

function List() {
    this.val = [];
    [].slice.call(arguments).map(item => {
        this.val.push(item);
    });
}

List.prototype.add = function() {
    [].slice.call(arguments).map(item => {
        this.val.push(item);
    });
}

List.prototype.all = function() {
    return this.val;
}

还差length方法的实现。

阅读 2.8k
3 个回答
function List(){
    this.arr=[];
    [].push.apply(this.arr,[].slice.call(arguments));
    this.length=this.arr.length;
}
List.prototype.add=function(){
    [].push.apply(this.arr,[].slice.call(arguments));
    this.length=this.arr.length;
}
List.prototype.all=function(){
    return this.arr;
}
var ls = new List('A', 'B', 'C');
console.log(ls.length); 
// add方法示例:
ls.add('D', 'E');
// length属性
console.log(ls.length); // => 5
// items属性
console.log(ls.all());

也可以直接继承array

class List extends Array{
    add(...args){
        this.push(...args)
    }
    all(){
        return this;
    }
}
var ls = new List('A', 'B', 'C');
// add方法示例:
ls.add('D', 'E');
// length属性
ls.length; // => 5
// items属性
ls.all(); // => ['A', 'B', 'C', 'D', 'E']

List.length = this.all().length ???

可以使用 defineProperty 绑定,还有可以复用 add 方法,all 方法返回副本不容易被误改。

function List() {
    this.val = [];
    Object.defineProperty(this, 'length', {
        get: function() { return this.val.length }
    });
    this.add.apply(this, arguments);
}

List.prototype.add = function() {
    this.val.push.apply(this.val, arguments);
}

List.prototype.all = function() {
    return this.val.slice();
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题