在Javascript

时间:2016-12-23 15:47:29

标签: javascript arrays object function-expression

我想创建一个InvertedPeninsula类型的新对象:

var invertedPeninsula = new InvertedPeninsula();

要创建此对象类型,我使用对象构造函数:

var InvertedPeninsula = function() {
  this.inhabitants = [
    {
      name: 'Flanery',
      race: 'Human'
    },
    {
      name: 'Sir Charles',
      race: 'Human'
    },
    {
      name: 'Ealei',
      race: 'Elf'
    },
    {
      name: 'Orado',
      race: 'Spector'
    }
  ];

  this.inhabitants.getRace = function(race) {
    var members = [];
    for (var i=0, l = this.length; i < l; i++) {
      if (this[i].race === race) {
        members.push(this[i]);
      }
    }

    return members;
  };

  this.inhabitants.humans = function() {
    return this.getRace('Human');
  };

  this.inhabitants.elves = function() {
    return this.getRace('Elf');
  };

  this.inhabitants.spectors = function() {
    return this.getRace('Spector');
  };
};

总之,构造函数使用一个名为&#34;居民&#34;的数组创建一个对象。它本身包含4个对象文字。然后,InvertedPeninsula对象类型构造函数继续向居民数组添加四个函数表达式。换句话说,居民阵列包含4个对象和4个方法,也可以通过使用&#34; for-in&#34;来打印阵列的内容来确认。迭代器。

一切都表现得像我想要的那样,但我想要理解的是,为什么在地球上这个构造函数可以在不提及它的名字的情况下引用居民数组。特别是:

for (var i=0, l = this.length; i < l; i++) 

上面的代码不应该是:

for (var i=0, l = this.inhabitants.length; i < l; i++) 

相反?

同样,人类,精灵和幽灵数组属性都返回:

return this.getRace('Human');
return this.getRace('Elf');
return this.getRace('Specter');

分别。但是,不应该是:

return this.inhabitants.getRace('Human');
return this.inhabitants.getRace('Elf');
return this.inhabitants.getRace('Specter');

我做了这些建议的更改,但在尝试调用任何一个函数时,例如:

invertedPeninsula.inhabitants.humans();

我收到这些错误:

  

未捕获的TypeError:无法读取属性&#39; getRace&#39;未定义的

     

未捕获的TypeError:无法读取属性&#39;长度&#39;未定义的

我使用的是Google Chrome 55.0.2883.87 m

关于这里发生了什么的任何可能的解释?

1 个答案:

答案 0 :(得分:4)

它起作用的原因是你执行此操作时的上下文:

invertedPeninsula.inhabitants.humans();

...不是invertedPeninsula,而是invertedPeninsula.inhabitants,因此方法中对this的任何引用都是invertedPeninsula.inhabitants

另请注意,您只在构造函数中定义了一个属性:inhabitants

您在该构造函数中定义的所有其他方法都不是在this上创建的,而是在this.inhabitants上创建的,并且 数组对象正在通过更多方法进行扩展,而不是正在构建的对象。