# 前置知识点(一)

# 问题--如何用子对象代理执行

如下,有一个对象parent,他有一个子对象child,我希望当我访问parent.tip()时, 由于我父对象没有这个方法,所以我希望由我子对象来代理执行这个方法,即调用parent.child.tip()

let parent = {
  name: "parent",
  child: {
    name: "child",
    tip() {
      console.log("tip a times");
    }
  }
};
1
2
3
4
5
6
7
8
9

# 解决思路

首先我们可以先声明一个用于代理的类函数

/**
 * @param {object} proto
 * @param {string} target
*/
function MyProxy(proto, target) {
  if (!(this instanceof MyProxy)) return new MyProxy(proto, target);
  this.proto = proto;
  this.target = target;
}

MyProxy.prototype.method = function (name) {
  var proto = this.proto;
  var target = this.target;

  /** 这一段的意思是,当我访问proto上的某个方法时,
   * 用proto[targert]上的同名方法来代理执行*/
  proto[name] = function () {
    return this[target][name].apply(this[target], arguments);
  };
  return this;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

利用上面的构造函数,我们可以对parent对象,做如下处理, 然后对parent.tip()进行访问.

注意此时的this指向 你可以在这里查看示例 (opens new window)

MyProxy(parent, "child").method("tip");
parent.tip(); //tip a times 
console.log(parent.tip() === parent.child.tip.apply(parent)); //true
1
2
3