элемента - Функции экземпляра JavaScript в сравнении с функциями прототипа




тест контент менеджер (3)

Возможный дубликат:
Использование «прототипа» против «этого» в Javascript?

Мое понимание различных функций JavaScript заключается в следующем:

function MyObj() {
    this.propOne = true;
    this.publicInstanceFunc = function() {
        if (propOne)
            return 'public instance function';
    }
    function privateFunc() {
        return 'private function only visible inside this constructor';
    }
}

MyObj.prototype.protoFunc = function() {
    if (this.propOne)
        return 'prototype function shared amongst all instances of MyObj';
}
  1. Правильны ли они?
  2. В каких случаях следует ставить функции на прототипе (например, protoFunc ) и в конструкторе (например, publicInstanceFunc )?
  3. Использует ли this правильный способ доступа к свойствам внутри функций прототипа?

Правильны ли они?

Err. Ну, это зависит от того, что вы хотите сделать. Нет ни одной принятой канонической модели для реализации наследования типа класса / экземпляра в JavaScript.

Но это:

    if (propOne)

Вероятно, это ошибка, поскольку this.propOne является свойством объекта-владельца, тогда как propOne сам по себе является переменной, которая не была объявлена ​​(по умолчанию это глобальная переменная, но обычно является ошибкой).

В каких случаях следует ставить функции на прототипе (например, protoFunc) и в конструкторе (например, publicInstanceFunc)?

Функция, установленная на прототипе, является той же самой функцией, которая используется для всех объектов. Единственный способ определить, к какому экземпляру он принадлежит, - это прочитать «это», когда он вызывается.

Функция, установленная в 'this' в конструкторе, является новой функцией для каждого экземпляра MyObj . Вы можете использовать это как альтернативный способ привязки к объекту владельца на основе закрытий вместо «this», который может сэкономить, выписывая материал для привязки функций. Это другой стиль объектной ориентации, который обычно не смешивался с этим стилем.


1) Да, ваш код прав.

2) Я использую функции, определенные в функции конструктора, когда я хочу получить доступ к другим членам, определенным конфиденциально внутри области самой функции конструктора, например, когда вы хотите создать привилегированные методы .

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

3) Да, если свойство является общедоступным, вы можете получить к нему доступ, используя this ключевое слово внутри расширенной функции прототипа, поскольку this относится к экземпляру вашего объекта.


Что касается второго момента, вы расширите прототип, чтобы все уже созданные объекты получили новый метод.

Кроме того, вы можете добавлять методы к встроенным объектам (например, добавление trim() в string ).





prototype-programming