如何在原型链中插入一些东西?

时间:2011-04-08 17:58:46

标签: javascript prototypal-inheritance

我有一个“类”,基本上是一个加强的Array

function NamedArray(name) {
  var result = [];
  result.name = name;
  return result;
};

var cheeses = new NamedArray('Cheeses');

这很有效。什么是行不通的是为这个“类”添加原型:

NamedArray.prototype = {
  nameInAllCaps: function() {
    return this.name.toUpperCase();
  }
};

cheeses.nameInAllCaps();
=> TypeError: Object #<Object> has no method 'nameInAllCaps'

我的第一个想法是将“原型”混合到result Array中:

function NamedArray(name) {
  var result = [];
  result.name = name;
  for (var prop in NamedArray.prototype) {
    if (NamedArray.prototype.hasOwnProperty(prop) {
      result[prop] = NamedArray.prototype[prop];
    }
  }
  return result;
};

这样可行,但它会使每个实例拥有自己的原型属性副本。有没有办法将插入 NamedArray.prototype插入result Array的原型链?

1 个答案:

答案 0 :(得分:2)

詹姆斯

问题是你的“构造函数”返回的内容是其他,而不是new创建的新分配的对象。 (相反,你是从里面你的构造函数创建一个数组,然后返回它。)

要纠正构造函数代码的这个令人困惑的方面,请考虑以下内容:

function NamedArray(name) {
  this.name = name;
};

NamedArray.prototype = new Array();
NamedArray.prototype.nameInAllCaps =  function() {
  return this.name.toUpperCase();
}

c = new NamedArray("cheeses");
console.log(c.name);
console.log(c.nameInAllCaps());