#61 监听数组变化


  • 0
    管理员

    调用push方法 console.log的次数不对?有点奇怪了这个报错

    function ObserverableArray() {
      return new Proxy([], {
        get(target, propKey) {
          typeof target[propKey] == 'function' && console.log(propKey);
          return target[propKey]
        }
      })
    }
    

  • 0
    administrators

    @陈小俊 这种方式其实是不符合题意的。

    这样会导致所有函数都会打印内容,例如 forEach,而题目只要求 7 个方法。


  • 0
    管理员

    @胡子大哈 哦哦


  • 1
    管理员

    function ObserverableArray() {
      return new Proxy([], {
        get(target, propKey) {
          const matArr = ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'];
          matArr.indexOf(propKey) > -1 && console.log(propKey);
          return target[propKey]
        }
      })
    }
    

  • 0

    我觉得很奇怪,我的arrMethods如果是[],就是ac,如果是{},就是返回的是需要时数组0_1496665756372_upload-a5c0e414-b233-4a57-9a0e-4a554b9ad344

    function ObserverableArray (){
      var arr = new Array();
      var arrMethodsName = ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse'];
      var arrMethods = [];
      arrMethodsName.forEach(function(method, index) {
        let original = Array.prototype[method];
        arrMethods[method] = function () {
          console.log(`${method}`);
          return original.apply(this, arguments);
        }
      })
      arr.__proto__ = arrMethods;
      return arr;
    }
    

  • 0

    @ScriptOJ#61 监听数组变化 中说:

    MVVM

    // TODO
    class ObserverableArray{
    constructor(){
    //理代原生原
    let arr = new Array();
    let specials = ['push','pop','shift','unshift','splice','sort','reverse'];
    specials.forEach((method) => {
    arr[method] = function(){
    console.log(method);
    return Array.prototype[method].apply(this,arguments);
    };

    })
    return arr;
    

    }
    }


  • 0

    我直接把新的方法定义在ObserverableArray 的原型上,不知道为什么不行,结果是“调用 push 方法对数组的操作不正确”

    @ScriptOJ

    class ObserverableArray extends Array {
          constructor(...props) {
            super(...props);
          };
    
          push(arg) {
            console.log('push');
            return Array.prototype.push.call(this, arg);
          };
    
          pop() {
            console.log('pop');
            return Array.prototype.pop.call(this)
          };
    
          shift() {
            console.log('shift');
            return Array.prototype.shift.call(this)
          };
    
          unshift(arg) {
            console.log('unshift');
            return Array.prototype.unshift.call(this, arg)
          };
    
          splice(index, target, ...res) {
            console.log('splice');
            return Array.prototype.splice.call(this, index, target, ...res)
          };
    
          sort(callback) {
            console.log('sort');
            return Array.prototype.sort.call(this, callback)
          };
    
          reverse() {
            console.log('reverse');
            return Array.prototype.reverse.call(this)
          }
        }
    

  • 0

    @duola push是可以接受多个参数的


  • 0

    @dsize1 噢,是我忽略了,多谢


  • 0

    0_1549462382136_#61 监听数组变化.png


登录后回复
 

与 ScriptOJ 的连接断开,我们正在尝试重连,请耐心等待