2012-06-26 3 views
3

Я узнаю о прототипе JS.Понимание прототипа javascript

Если я установил прототип конструктора (A) из экземпляра какого-либо другого конструктора (B), будет ли этот экземпляр (из B) вводить общие свойства в A?

Пример 1

function A(){ 
    var private = ''; 

    this.getPrivate = function(){ 
     return private 
    }; 

    this.setPrivate = function(_private){ 
     private = _private; 
    }; 
} 

function B(){}; 

B.prototype = new A(); 

b1 = new B(); 
b2 = new B(); 

b1.setPrivate(new Date()); 
b2.getPrivate(); // Here `private` is behaving as singleton property. Why? 

Пример 2

function A(){ 
    var private = ''; 
} 

A.prototype.getPrivate = function(){ 
    return this.private 
}; 

A.prototype.setPrivate = function(_private){ 
    this.private = _private; 
}; 

function B(){}; 

B.prototype = new A(); 

b1 = new B(); 
b2 = new B(); 

b1.setPrivate(new Date()); 
b2.getPrivate(); // This time private is not singleton property. 

я обнаружил этот новый аспект прототипа, играя с ним.

  • В примере 1, поэтому private свойство распределяется между различными экземплярами B?
  • В примере 2, почему private свойство имеет независимое присутствие в обоих случаях? Однако исходное свойство не изменяется, но геттер/сеттер определяются через прототип.
  • Можно ли считать пример 1 реализацией одноэлементных свойств?
  • Прототипирование через экземпляр и прототипирование через прототип, в чем разница? например
    B.prototype = new A();
    B.prototype = (new A()).constructor.prototype
  • Каковы полные секреты прототипирования?

ответ

1
  1. Поскольку вы наследуете конкретный экземпляр, заблокированный для определенных замыканий. Данные принадлежат закрытию, а не объекту. Существует огромная разница между переменными и свойствами объекта.

  2. var private здесь не используется. Когда вы setPrivate(), свойство создается в этой точке.

  3. Нет, это просто случайно из-за непонимания между замыканиями и объектной моделью. Вы можете сделать то же самое гораздо более продуманным и понятным способом: используя простой объектный литерал.

  4. Разница заключается в том, что в первом вы получите новый объект, где, как во втором, который вы имеете A.prototype === B.prototype так модифицирования один модифицирует другой, так как они ссылаются на один и тот же объект.

  5. объекты наследуют от других объектов

Вот хороший ресурс https://developer.mozilla.org/en/JavaScript/Guide/Details_of_the_Object_Model

+0

Да, простой объектный литерал может быть преднамеренным выбором для объекта singleton. Но частичные одноэлементные свойства могут быть реализованы таким образом. У меня есть сценарий, в котором разные объекты fx содержат изолированные конфигурации, но разделяют ссылку на элементы dom, на которых они работают. –

+0

@ShuaibNawaz Я не знаком с понятием * partial * singleton: P – Esailija

+0

Я не собираюсь монетовать новый термин. : D Я имею в виду определение нескольких общих свойств среди экземпляров, и это сработало для моего сценария, и я не совсем понял его концепцию. В любом случае, спасибо. –

1

Секрет прототипирования (который объясняет все это) является то, что каждый экземпляр B акций того же прототипа, то есть прототип не копируется в новые экземпляры B. Когда вы запускаете прототип функции любого экземпляра B, вы на самом деле выполняете ту же функцию все время. Вот почему копируется «частная» переменная (на самом деле она не копируется, вы все время ссылаетесь на одну и ту же переменную). Переменные «Nonprivate» ведут себя одинаково, за исключением того, что ключевое слово this относится к текущему «держателю» функции. Именно поэтому вызов прототипа this дает нам иллюзию прототипа, фактически являющегося методом объекта. Это не.

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

И, наконец: прототипирование некоторых источников может быть истолковано как одиночный.

1

В примере 1, почему частная собственность распределяется между различными экземплярами из B?

Да они

В примере 2, почему частная собственность имеет независимое присутствие в обоих случаях ? Однако исходное свойство не изменяется, но получатель/сеттер определяются через прототип.

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

Можно ли считать пример 1 реализацией одноэлементных свойств?

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

Прототипирование через экземпляр и прототипирование через прототип, Какая разница ? например

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

Каковы полные секреты прототипирования?

Просматривает хорошие статьи в различных блогах Jin Ninja.Я люблю:

Вот хорошая статья:

1

В примере 1, используется объем закрытия для обозначения частный. Поскольку A создается только один раз, один экземпляр его определен.

В примере 2 this.private не ссылается на экземпляр private в функции A. Фактически, поскольку вы используете слово «это», оно относится к «этому» объекта. Следовательно, this.private либо означает b1.private, либо b2.private в зависимости от функции. В примере 2 частный, определенный в функции A, теряется в области закрытия, и он, как если бы он никогда не определялся.

+0

Хорошее объяснение –

Смежные вопросы