вторник, 28 января 2014 г.

Потеря constructor при изменении prototype

При создании функции конструктора, её prototype - это объект с единственным свойством constructor, которое указывает на саму функцию конструктор.

function Rabbit() { }

var rabbit = new Rabbit();

alert( rabbit.constructor == Rabbit ); // true

Таким образом, мы можем использовать свойство constructor, чтобы получить функцию-конструктор объекта, но при смене прототипа нужно смотреть, чтобы ненароком не перезаписать его.

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

var rabbit = new Rabbit('Nick');
var cat = new rabbit.constructor('Ann');

alert(cat.name); // Ann

Свойство prototype есть у каждой функции, даже если его не ставить. Оно создается автоматически вместе с самой функцией, и по умолчанию является пустым объектом с единственным свойством constructor, которое ссылается обратно на функцию.

Вот такой вид имеет прототип по умолчанию:

function Rabbit () {}

Rabbit.prototype = {
  constructor: Rabbit
}

При переопределении прототипа свойство constructor может из него пропасть.

function Rabbit() { }

Rabbit.prototype = {};  // Теперь свойство constructor пропало!!!

var rabbit = new Rabbit();

alert( rabbit.constructor == Object ); // Теперь свойство constructor ссылается на Object, а не Rabbit, так как у Rabbit свойство constructor пропало после переопределения prototype!!!

Комментариев нет:

Отправить комментарий