迭代器

https://zh.javascript.info/iterable

数组解构

https://zh.javascript.info/destructuring-assignment

JSON

https://zh.javascript.info/json#jsonparse

属性的读写性质

https://zh.javascript.info/property-descriptors

逐级defineProperty实验

  1. var personA={
  2. name:'A',
  3. age:25,
  4. hobby:{
  5. basketball:'very well',
  6. piano:'so so'
  7. },
  8. secret:{
  9. s1:{
  10. name:'love',
  11. to:'person2'
  12. }
  13. }
  14. }
  15. const observe = data => {
  16. if (!data || typeof data !== 'object') {
  17. return
  18. }
  19. Object.keys(data).forEach(key => {
  20. let currentValue = data[key]
  21. observe(currentValue)
  22. Object.defineProperty(data, key, {
  23. enumerable: true,
  24. configurable: false,
  25. get() {
  26. console.log(`getting ${key} value now, getting value is:`, currentValue)
  27. return currentValue
  28. },
  29. set(newValue) {
  30. currentValue = newValue
  31. console.log(`setting ${key} value now, setting value is`, currentValue)
  32. }
  33. })
  34. })
  35. }
  36. observe(data)

数组排序

看代码

系统方法

典型点总结 - 图1

原型和继承

https://blog.51cto.com/14047134/2319663
简书

Proxy发布订阅

  1. // 'use strict'
  2. const myobservable = obj => new Proxy(obj, {set});
  3. const queuedObservers = new Set();
  4. const myobserve = fn => queuedObservers.add(fn);
  5. function set(target, key, value, receiver) {
  6. //Reflect.set返回Boolean
  7. // const result = Reflect.set(target, key, value, receiver);
  8. target[key]=value
  9. queuedObservers.forEach(observer => observer());
  10. // 严格模式下,Proxy Handler的set需要返回真,否则将报错
  11. //非严格模式下,可以不用下面这行
  12. // return result;
  13. }
  14. // 实例
  15. const person = myobservable({
  16. name: '张三',
  17. age: 20
  18. });
  19. function print() {
  20. console.log(`${person.name}, ${person.age}`)
  21. }
  22. myobserve(print);
  23. person.name = '李四';
  24. person.gh = '李四';
  25. console.log(person)
  26. // 输出

Proxy和Reflect发布订阅

  1. // 'use strict'
  2. const myobservable = obj => new Proxy(obj, {set});
  3. const queuedObservers = new Set();
  4. const myobserve = fn => queuedObservers.add(fn);
  5. function set(target, key, value, receiver) {
  6. //Reflect.set返回Boolean
  7. const result = Reflect.set(target, key, value, receiver);
  8. queuedObservers.forEach(observer => observer());
  9. // 严格模式下,Proxy Handler的set需要返回真,否则将报错
  10. //非严格模式下,可以不用下面这行
  11. return result;
  12. }
  13. // 实例
  14. const person = myobservable({
  15. name: '张三',
  16. age: 20
  17. });
  18. function print() {
  19. console.log(`${person.name}, ${person.age}`)
  20. }
  21. function print1() {
  22. console.log('hello')
  23. }
  24. myobserve(print);
  25. myobserve(print1);
  26. person.name = '李四';
  27. person.gh = '李四';
  28. // 输出