Как мне вставить что-то в цепочку прототипов? - PullRequest
2 голосов
/ 08 апреля 2011

У меня есть «класс», который по сути является расширенным 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 Ответ

2 голосов
/ 11 апреля 2011

Джеймс,

Проблема в том, что ваш "конструктор" возвращает что-то другое , чем недавно выделенный объект, созданный 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());
...