(帮助者注意:这个问题可能没有解决方案)
大家好,
我正在解决自己给自己的一个小挑战。当我遇到一个看似不可能完成的任务时。挑战如下。
顶级
有一个使用闭包来模拟类的函数。 (我所说的类是指当您声明一个新类时在 C++ 或 C# 中获得的内容。) top 函数将返回一个内部函数,该函数具有 props 并返回更改这些 props 的方法。这意味着我无法直接访问 Prop 。 (在传统类中将变量声明为 private 时会得到什么)
代码
const Person = function() { //outer function
const closures = () => { // inner function
let firstName, lastname, age, gender; // "class" properties (props) unknown to Person
return { // returns the methods I can use to update or get the props + functionalities
//setters - can set the properties of closures
setFirstName: (name) => {
firstName = name;
},
setLastName: (surname) => {
lastname = surname;
},
setAge: (newAge) => {
newAge > 0 && newAge < 150 ? age = newAge : console.warn(`Age has not been set, ${newAge} is out of range`);
},
setGender: (newGender) => {
const personExist = (firstName || lastname);
personExist? gender = newGender : console.warn("This person does not exist, you need to define their first or last name . . .");
personExist?checkGender(newGender) ? gender = newGender : console.warn(`Gender has not been set. ${newGender} is not supported at the moment.`) : null;
;
},
//getters - can get the properites of closures
getFirstName: () => firstName,
getLastName: () => lastname,
getAge: ()=> age,
getGender: ()=>gender,
//Functionalities -- things that a Person obj can do
introduction: () => {
let p1 = firstName ? `Grettings, my name is ${firstName}` : lastname ? `Last Name is ${lastname}` : '';
let p2 = firstName ?
lastname ? ` ${lastname}.` : '' :
lastname ? `. You can refer to me as ${lastname}`: '';
let p3 = age? `I am ${age} years-old.` : '';
let p4 = p1 != '' || p2 != '' ? `${lastname?`${p1}${p2} ${p3}`: `${p1}.${p2} ${p3}`}` : "I do not know me . . .";
return `${p4}`
},
speak: function to(Person) { // troublesome part
if(typeof Person == 'object'){
console.log(`> ${Person.introduction()}`);
// console.log(name.caller)
// console.log(name.prototype)
// everything was going well till this part of the challenge, where I am trying to get name.caller so i can access its props
} else {
console.warn(`Cannot talk to ${Person} because ${Person} is not of type person.`)
}
}
}
}
return closures();
}
// this is the entire code, feel free to use it in anyway whatsoever.
问题
我所面临的挑战的最后一部分是当我尝试实现“说话”功能时。
-- 预期行为
Person 实例(不是第一个创建的)将调用 talk,传入另一个 person 实例。
在发言中,论证将使用声明的方法之一 self 介绍。然后来电者将进行 self 介绍。
--麻烦的部分
我无法访问“to's”(发言的功能子名称)调用者。 (如果您想知道,我需要给它一个子名称,因为如果我尝试调用“speak”,它将产生错误。)简单的解决方案是将调用者作为参数传递,但我想能够使用调用者方法来访问它。
例如下面的代码
let rian = Person();
rian.setFirstName("Rian");
rian.setLastName("Arias");
rian.setGender("Male");
rian.setAge(30);
let pepe = Person();
pepe.setFirstName("Pepe");
pepe.setLastName("Lopez");
pepe.setGender("Male");
pepe.speak(dario); // will not work because I haven't been able to get 'caller' to work
应输出以下内容
> 大家好,我叫达里奥·阿里亚斯。我20岁了。 < 您好,我叫佩佩·洛佩兹。
最佳答案
您可以使用 this
访问当前的 person 实例:
console.log(`> ${this.introduction()}`);
function checkGender(gender) { return ["Male", "Female"].includes(gender) }
const Person = function() { //outer function
const closures = () => { // inner function
let firstName, lastname, age, gender; // "class" properties (props) unknown to Person
return { // returns the methods I can use to update or get the props + functionalities
//setters - can set the properties of closures
setFirstName: (name) => {
firstName = name;
},
setLastName: (surname) => {
lastname = surname;
},
setAge: (newAge) => {
newAge > 0 && newAge < 150 ? age = newAge : console.warn(`Age has not been set, ${newAge} is out of range`);
},
setGender: (newGender) => {
const personExist = (firstName || lastname);
personExist? gender = newGender : console.warn("This person does not exist, you need to define their first or last name . . .");
personExist?checkGender(newGender) ? gender = newGender : console.warn(`Gender has not been set. ${newGender} is not supported at the moment.`) : null;
;
},
//getters - can get the properites of closures
getFirstName: () => firstName,
getLastName: () => lastname,
getAge: ()=> age,
getGender: ()=>gender,
//Functionalities -- things that a Person obj can do
introduction: () => {
let p1 = firstName ? `Grettings, my name is ${firstName}` : lastname ? `Last Name is ${lastname}` : '';
let p2 = firstName ?
lastname ? ` ${lastname}.` : '' :
lastname ? `. You can refer to me as ${lastname}`: '';
let p3 = age? `I am ${age} years-old.` : '';
let p4 = p1 != '' || p2 != '' ? `${lastname?`${p1}${p2} ${p3}`: `${p1}.${p2} ${p3}`}` : "I do not know me . . .";
return `${p4}`
},
speak: function to(Person) { // troublesome part
if(typeof Person == 'object'){
console.log(`> ${Person.introduction()}`);
console.log(`> ${this.introduction()}`);
// console.log(name.caller)
// console.log(name.prototype)
// everything was going well till this part of the challenge, where I am trying to get name.caller so i can access its props
} else {
console.warn(`Cannot talk to ${Person} because ${Person} is not of type person.`)
}
}
}
}
return closures();
}
let rian = Person();
rian.setFirstName("Rian");
rian.setLastName("Arias");
rian.setGender("Male");
rian.setAge(30);
let pepe = Person();
pepe.setFirstName("Pepe");
pepe.setLastName("Lopez");
pepe.setGender("Male");
pepe.speak(rian);
关于javascript - 如何获取对象 props 函数调用者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59537737/