首页 > 解决方案 > 库设计 - 原型方法的返回值未定义,除非使用绑定

问题描述

我想知道为什么这个对象需要绑定到返回对象才能使这个方法起作用。

function person( _name ) {

    function InnerPerson( _name ) {
        this.name = _name;
    }

    InnerPerson.prototype = {
        me: function() {
        return "Hi, my name is " + this.name;
        }
    };

    var innerPerson = new InnerPerson( _name );

    return {
        me: innerPerson.me // this only works if you add .bind( innerPerson )
    };
}

var josh= person("josh");
console.log( josh.me() ); // Hi, my name is undefined

在这个执行过程中,一步一步发生了什么?如果对象已明确创建并且对象的返回值在其中引用了它,那么在调用时如何this.name未定义?为什么在这个例子中需要?josh.me()personme: innerPerson.mebind

对此进行解释的部分原因不仅仅是thisJavascript 中的工作方式或上下文。在这个问题中发生了一些具体的事情,this一般意义上的理解并不能完全解释。例如,如果我调用innerPerson.me()而不是返回函数定义,我会得到正确的上下文。正是因为我返回的内容和this变化。

标签: javascript

解决方案


您必须了解是如何工作的。您想要实现的目标可以是取一个thisParent并在其内部使用InnerPersonprototype

function person(_name) {
  var thisParent = this;

  function InnerPerson(_name) {
    thisParent.name = _name;
  }

  InnerPerson.prototype = {
    me: function() {
      return "Hi, my name is " + thisParent.name;
    }
  };

  var innerPerson = new InnerPerson(_name);

  return {
    me: innerPerson.me // this only works if you add .bind( innerPerson )
  };
}

var josh = person("josh");
console.log(josh.me());


推荐阅读