我创建了一个示例结构,以便更好地了解方法的行为。
此关键字是指方法的对象。像这样;
const obj1 = {
x(param1, param2) {return param1 * param2},
y(param1, param2, param3) {return param1 * param2 * param3},
z () {
console.log(this)
console.log(this.x(10,20))
console.log(obj1.x(10,20))
return 'done'
/*
{ x: [Function: x], y: [Function: y], z: [Function: z] }
200
200
*/
}
}
如果我需要使用这种结构怎么办?
const obj2 = {
a: {
x(param1, param2) {return param1 * param2},
y(param1, param2, param3) {return param1 * param2 * param3},
},
b: {
p: 5,
z() {
console.log(this)
console.log(this.x(10,20)) // Fails because there is not a method which is called x inside **this**
console.log(obj2.a.x(10,20))
return 'done'
/*
{ x: [Function: x], y: [Function: y], z: [Function: z] }
TypeError
200
*/
}
}
}
在属性内调用另一个方法的唯一方法是这个吗? obj2.a.x(10,20)
还有其他方法吗?关于这个主题有什么最佳实践吗?
也许这应该是另一个问题,但这是超级相关的,所以...
如果我想使用这种箭头功能怎么办?
const obj3 = {
x: (param1, param2) => param1 * param2,
y(param1, param2, param3) {return param1 * param2 * param3},
z: () => {
console.log(this)
console.log(obj3.x(10,20))
return 'done'
/*
{ }
TypeError
200
*/
}
}
在这种情况下,当我使用 this 时,它将返回空对象。同样,我应该使用 obj3.x(10,20)来调用x方法吗?
在我看来,在对象内部写最外层的对象名称似乎并不那么酷,但是找不到其他解决方案。等待您的意见!
答案 0 :(得分:-1)
您可以使用closures
function closureObj() {
let self = this;
self.x = (param1, param2) => { return param1 * param2};
self.z = () => {
console.log(self);
console.log(self.x(10,20));
return 'done';
/*
{ }
TypeError
200
*/
};
//public methods
return {
publicMethod : self.z
}
}
let closure1 = new closureObj();
closure1.publicMethod();