代码之家  ›  专栏  ›  技术社区  ›  Eggs

在对象文字的方法内绑定对象(ES5)

  •  1
  • Eggs  · 技术社区  · 7 年前

    我有两个对象,Person和Person1,我试图理解为什么我无法绑定Person1。getName在Person对象中使用不同的methodName。如果我获取下面的代码并在控制台中运行它,我会得到

    名称:未定义未定义

    这是我的代码:

    var Person = {
      firstname : "John",
      lastName : "Doe",
      getFullName : function() {
        console.log("Name : " + this.firstname + " " + this.lastName);
      }
    };
    
    var Person1 = {
      firstname : "Jane",
      lastName : "Doe",
      Person1.getName : Person.getFullName.bind(Person1)  
    }
    
    Person1.getName(); 
    

    但是,如果我从Person1对象文字中删除该方法,并在该方法在以下代码中正常工作后添加该方法:

    var Person = {
      firstname : "John",
      lastName : "Doe",
      getFullName : function() {
        console.log("Name : " + this.firstname + " " + this.lastName);
      }
    };
    
    var Person1 = {
      firstname : "Jane",
      lastName : "Doe"
    }
    
    Person1.getName = Person.getFullName.bind(Person1);  
    Person1.getName(); 
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Estus Flask    7 年前

    var Person1 已吊装,且 Person1 变量已定义,但等于 undefined 当时 Person.getFullName.bind(Person1) 已评估。

    由于什么原因 this 如果有效,该方法不需要绑定(除非它与上下文分开使用,例如作为回调)。

    它应该是:

    var Person1 = {
      firstname : "Jane",
      lastName : "Doe",
      getName : Person.getFullName
    }
    
        2
  •  1
  •   Julien Ambos    7 年前
    1. 在对象文字中,您不能引用对象将分配给的变量名。
    2. Person1.getName : Person.getFullName.bind(Person1) 不是在对象文本中声明方法的正确语法。您在中的操作是正确的 var Person .

    您的代码必须是:

    var Person1 = {
       firstname : "Jane",
       lastName : "Doe",
       getName : Person.getFullName  
    }