折叠何宝莹

JavaScript 监听数组变化 | 手写数组类

实现一个可观察的数组类(ObArray),可以监听push、unshift操作,但其余函数保持与原生Array一致
其余方法,如pop、shift、indexOf等等无改动
这是我的写法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class ObArray extends Array{
constructor(...args) {
super(...args)
}
push(...args){
console.log('push '+ args)
return super.push(...args);

}
unshift (...args) {
console.log('unshift '+ args)
return super.unshift(...args);
}
}

面试官:

那个数组类的问题是我最近刚想的,还有不少纰漏。。。没写出我期望的考点~所以就。。。不评论了

那就是不能使用继承,而是自己包装一个数组类,后来重新翻了高程,写了一下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
var log = console.log.bind(console)
var observifyArray = function (array) {
var aryMethods = ['push', 'unshift']
var arrayAugmentations = Object.create(Array.prototype)

aryMethods.forEach((method)=> {

let original = Array.prototype[method]
arrayAugmentations[method] = function () {
log(method, ...arguments)
return original.apply(this, arguments)
};
});
array.__proto__ = arrayAugmentations
}

var ObArray = function () {
log(this, ...arguments)
var a = Array.apply(this,arguments)
observifyArray(a)
return a
}

/**验证 */
// console.log(JSON.stringify(array))
var oba = new ObArray("a",1,3);
oba.push("111")
log(JSON.stringify(oba))
// log(oba.pop())
// log(JSON.stringify(oba))