4Manuals

  • PDF Cloud HOME

如何获得对象道具函数的调用者? Download

    CSS / JS-如何覆盖一个孩子而不是其他孩子的父母过渡 我的Javascript从'string'转换为'integer'或'number'无效 反应:更改方向后触发重新渲染和offsetWidth的重新计算 在React Native 如何删除外部索引并合并内部json 图片无法通过javascript刷新 如何在react图表上的datakey中操作DateTime 在Cypress中保存变量 如何从作为请求传递的输入类型数据绑定中提取数据 通过dropzone laravel通过电子邮件发送多个图像

(请注意:这个问题可能没有解决办法)

问候所有

我正在解决自己给自己带来的一个小挑战。当我遇到一个看似不可能完成的任务时。挑战如下。

最高水平
具有使用闭包来模拟类的函数。 (按类,我的意思是声明新类时在C ++或C#中会得到什么。)顶部函数将返回一个内部函数,该函数具有props,并返回更改这些props的方法。这意味着我无法直接访问道具。 (当您在传统类中的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实例(不是第一个创建的实例)将调用语音,并传入另一个person实例。 在语音中,参数将使用声明的方法之一进行自我介绍。然后,呼叫者将自我介绍。

-麻烦部分
我无法访问“ 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 

应输出以下内容

> Grettings,我叫Dario Arias。我20岁了。 <Grettings,我叫Pepe Lopez。

2 个答案:

答案 0 :(得分:2)

您可以使用this访问当前人员实例:

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);

答案 1 :(得分:0)

所以,我相信我已经找到了您的错误。作为js的一个很好的经验法则,每个名称最好只有1个变量。这可能只是在您的视线中漏掉了,我一直在这样做,但是您有两个名为Person的变量。我将您的语音功能更改为:

attach

它就像一个魅力。我还删除了对“ checkGender”的引用,并将“ dario”更改为“ rian”,并输出了我认为您想要的东西。另外,由于不确定为什么要/需要一个子名称,我删除了该函数的“ to”子名称。



Similar searches
    如何在Google电子表格中永久隐藏可旋转的编辑器框? 不和谐加入用户帐户漫游器 使用Firestore在Swift中完成处理程序的替代方法 如何导航到产品构建index.html页面中的组件? 获取选中的单选按钮的值作为字符串并将其存储在Firebase上