Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/417.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何获取对象道具函数调用者?_Javascript_Reactjs_Closures - Fatal编程技术网

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.`)
    }
  }