вторник, 9 июля 2013 г.

Подводный камень использования объекта в качестве прототипа в JavaScript

В случае, если вы используете объект в качестве  прототипа в JS, вы должны помнить, что свойство constructor становится некорректным. Дело в том, что свойство constructor существует у прототипа, и его нет у экземпляра объекта. Когда создается функция, прототип создается со свойством constructor эквивалентным названию функции. Однако в случае, если вы в качестве прототипа используете объект, он перезаписывает и свойство constructor. Чтобы этого не случилось, необходимо определить свойство constructor в прототипе:

function Person(name) {
    this.name = name;
}
Person.prototype = {
    constructor: Person,

    sayName: function() {
        console.log(this.name);
    },
    toString: function() {
        return "[Person " + this.name + "]";
    }
};

2 комментария:

  1. По-моему тогда проще вообще не использовать свойство constructor и поступать так, как делает CoffeeScript:

    var Person, person;

    Person = (function() {

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

    Person.prototype.sayName = function() {
    return console.log(this.name);
    };

    Person.prototype.toString = function() {
    return "[Person " + this.name + "]";
    };

    return Person;

    })();

    person = new Person('Igor');

    ОтветитьУдалить
    Ответы
    1. В данном случае ты используешь [[constructor]], который автоматически устанавливается функцией с именем, идентичным Person. Статья посвящена случаю, когда это не работает - при использовании объекта в качестве прототипа.

      Удалить