# 前置知识点(一)
# 问题--如何用子对象代理执行
如下,有一个对象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
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
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
2
3