Javascript 如何获取对象道具函数调用者?
(帮助者注意:此问题可能没有解决方案) 大家好, 我在解决我给自己的一个小挑战。当我遇到看似不可能完成的任务时。挑战如下 顶级Javascript 如何获取对象道具函数调用者?,javascript,reactjs,closures,Javascript,Reactjs,Closures,(帮助者注意:此问题可能没有解决方案) 大家好, 我在解决我给自己的一个小挑战。当我遇到看似不可能完成的任务时。挑战如下 顶级 有一个使用闭包来模拟类的函数。(我的意思是,当你声明一个新的类时,你在C++或C语言中得到了一些什么)。top函数将返回一个内部函数,它有道具,并返回方法来改变这些道具。这意味着我无法直接访问道具。(在传统类中在private下声明变量时得到的) 代码 const Person = function() { //outer function const closur
有一个使用闭包来模拟类的函数。(我的意思是,当你声明一个新的类时,你在C++或C语言中得到了一些什么)。top函数将返回一个内部函数,它有道具,并返回方法来改变这些道具。这意味着我无法直接访问道具。(在传统类中在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.
应该输出以下内容
>格雷廷斯,我叫达里奥·阿里亚斯。我今年20岁。
访问当前person实例:
console.log(`> ${this.introduction()}`);
function checkGender(性别){return[“男”、“女”]。includes(性别)}
const Person=function(){//外部函数
const closures=()=>{//内部函数
让名字、姓氏、年龄、性别;//“类”属性(道具)不为人所知
return{//返回我可以用来更新或获取道具+功能的方法
//setters-可以设置闭包的属性
setFirstName:(名称)=>{
名字=名字;
},
setLastName:(姓氏)=>{
姓氏=姓氏;
},
设置:(新设置)=>{
newAge>0&&newAge<150?age=newAge:console.warn(`age尚未设置,${newAge}超出范围`);
},
setGender:(newGender)=>{
const personExist=(firstName | | lastname);
personExist?gender=newGender:console.warn(“此人不存在,您需要定义他们的名字或姓氏…”);
personExist?checkGender(newGender)?gender=newGender:console.warn(`gender尚未设置。${newGender}目前不受支持。`):null;
;
},
//getters-可以获取闭包的属性
getFirstName:()=>firstName,
getLastName:()=>lastname,
getAge:()=>年龄,
getGender:()=>性别,
//功能——一个人obj可以做的事情
导言:()=>{
让p1=firstName?`Grettings,我的名字是${firstName}`:lastname?`lastname是${lastname}`:'';
让p2=名字?
lastname?`${lastname}.`:'':
lastname?`。您可以称我为${lastname}`:'';
让p3=年龄?`我是${age}岁。`:'';
设p4=p1!=''''.| p2!='''''.${lastname?'${p1}${p2}${p3}`:'${p1}.${p2}${p3}}}:“我不认识我…”;
返回`${p4}`
},
对(人)说:功能{//麻烦的部分
如果(人的类型==“对象”){
console.log(`>${Person.introduction()}`);
console.log(`>${this.introduction()}`);
//console.log(name.caller)
//console.log(name.prototype)
//在挑战的这一部分之前,一切都进行得很顺利,我正在尝试获取name.caller,以便访问它的道具
}否则{
warn(`无法与${Person}对话,因为${Person}不是Person类型。`)
}
}
}
}
返回闭包();
}
让rian=人();
rian.setFirstName(“rian”);
rian.setLastName(“阿里亚斯”);
女性(“男性”);
3.设置(30);
让pepe=Person();
pepe.setFirstName(“pepe”);
pepe.setLastName(“Lopez”);
佩佩·塞性别(“男性”);
佩佩说(瑞安)代码>所以我相信我找到了你的错误。作为js中的一条经验法则,最好每个名称只有一个变量。这可能从你的眼睛里溜走了,我一直在这么做,但你有两个变量,名为Person。我将您的讲话功能更改为:
speak: function (p) { // troublesome part
if(typeof p == 'object'){
console.log(`> ${p.introduction()}`);
} else {
console.warn(`Cannot talk to ${p} because ${p} is not of type person.`)
}
}
它就像一个符咒。我还删除了对“checkGender”的引用,并将“dario”改为“rian”,它输出了我相信您会想要的内容。此外,我删除了函数的“to”子名称,因为我不确定您为什么需要子名称。我想您的意思是pepe.speak(rian)代码>作为最后一行?什么是checkGender
?如果您想确保传递给speak
的参数是另一个人
,您还需要另一个闭包。我只想在中共享您的代码。checkGender是一个方法,它接受输入并返回true(如果该输入是有效的性别),否则返回false。我确实想用瑞安,我写这篇文章时很匆忙,这就是为什么整个解释都不完整的原因。这与Repl.it无关。如果您得到window对象,这意味着您没有使用点表示法调用函数,如pepe.speak()
,但可能传递了函数引用,如setTimeout(pepe.speak)
,在这种情况下,函数将不会像this
那样使用pepe
调用。有关详细说明,请参见
speak: function (p) { // troublesome part
if(typeof p == 'object'){
console.log(`> ${p.introduction()}`);
} else {
console.warn(`Cannot talk to ${p} because ${p} is not of type person.`)
}
}