Javascript: Возможно ли добавить новые функции в базовый «класс / объект», который будет доступен во всех подклассах / объектах? - PullRequest
0 голосов
/ 21 июля 2011

Я пытаюсь добавить новое свойство в класс в существующей структуре JavaScript (Wireit).

Базовый класс называется Container, и я хочу, чтобы все контейнеры имели свойство GUID.Контейнер в настоящее время подклассифицируется на ImageContainer, FormContainer и т. Д.

Если я расширю Контейнер, чтобы иметь GUID, будет ли GUID доступен в ImageContainer, FormContainer и т. Д .?

Как мне это сделать?Примеры?

Ответы [ 3 ]

3 голосов
/ 21 июля 2011

Прототип ОО работает так: когда вы:

  • ищите свойство объекта, скажем imageContainer
  • Он будет искать свойства этого объекта,
  • Если он не может найти ничего, он будет смотреть на прототип (ImageContainer.prototype)
  • Если он не может найти что-либо, он будет смотреть на следующий прототип ('Container.prototype')
  • И следующий прототип ('Object.prototype') до тех пор, пока цепочка прототипов не станет пустой, и в этом случае он возвращает undefined.

Это означает, что при добавлении свойства GUID

Container.prototype.GUID = 42;

Все объекты с Container.prototype в цепочке прототипов будут использовать это свойство.

Если вы не хотите, чтобы это свойстводля совместного использования очень трудно добавить уникальный GUID ко всем объектам с Container.prototype в их цепочке прототипов.

Однако вы можете использовать .isPrototypeOf, чтобы проверить, имеет ли объектпрототип в их цепочке.

Пример:

var objs = [..]; // all objects 

objs.forEach(function(v) {
  if (Container.prototype.isPrototypeOf(v)) {
    v.GUID = window.GUID++;
  }
});

Однако это зависит от

  • ES5.Используйте ES5-shim
  • Вы можете создать массив objs со всеми объектами, которые вы, возможно, захотите расширить.
0 голосов
/ 21 июля 2011

Как уже говорилось, если GUID - это функция, вы можете просто добавить ее в прототип контейнера. Если нет, добавьте эту функцию

container.prototype.GUID = function (v) {
  if (arguments.length) // setting the value
    return this.GUID = v;

  return this.hasOwnProperty ('GUID') ? this.GUID : undefined; 
}

Позволит вам получить доступ к свойству GUID с помощью obj.GUID () или установить его с помощью obj.GUID (val)

0 голосов
/ 21 июля 2011

Если я вас хорошо понял, вот пример:

http://jsfiddle.net/mMfdj/1/

А вот с автоматическими уникальными GUID:

http://jsfiddle.net/mMfdj/5/

...