猿问

面试题,求解答

定义一个列表类 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方法的实现。


aluckdog
浏览 857回答 2
2回答

繁花如伊

可以使用 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();}
随时随地看视频慕课网APP
我要回答