Здравствуйте, коллеги программисты, я взялся за изучение JavaScript. Этот синтаксис - чистое колдовство, может кто-то уточнить:

function CleanPet(){
    alert("The pet is now clean!");
}

CleanPet.Description="Dirty Business";

В материале, который я читаю, объясняется, что в JavaScript функции похожи на любой другой объект, но если я присоединяю свойство к функции, значит ли это, что оно статическое, поскольку я на самом деле его не объявил?

Спасибо за помощь, И.Н.

0
RealityDysfunction 27 Янв 2013 в 08:50

3 ответа

Лучший ответ

Свойства объекта не «объявляются» в формальном смысле использования var, как вы делаете для переменных. Учитывая существующий объект CleanPet, вы можете назначить свойства, такие как CleanPet.Description (как в вопросе), которые создадут свойство Description, если оно еще не существует, или перезаписать свойство, если оно уже существовал.

Также «законно» пытаться получить доступ к свойствам объекта, которые вы еще не установили, например, CleanPet.SomeOtherProperty - полученное значение будет undefined. (Не ошибка, хотя предполагается, что CleanPet на самом деле является объектом. Если CleanPet равен null или undefined, то CleanPet.SomeOtherProperty выдаст ошибку.)

Что касается функций, в частности, объявление функции:

 function CleanPet { /* some code */ }

... объявляет один объект, который оказывается функцией. Это означает, что вы можете вызывать его как функцию CleanPet(), но он по-прежнему получает «обычное» поведение объекта, например, возможность назначать свойства.

Функции JavaScript также являются конструкторами объектов, если их вызывать с помощью new:

var cleanPet1 = new CleanPet();

В этом случае JS создает новый объект (экземпляр) каждый раз, когда вы вызываете new CleanPet(), но свойство CleanPet.Description не доступно через cleanPet1.Description, потому что это свойство конструктора, а не свойство результирующего экземпляра new. Так что в этом смысле да, свойство является «статическим».

3
nnnnnn 27 Янв 2013 в 04:58

Функции в javascript являются объектами и могут иметь свойства.

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

Есть несколько причин, по которым это можно сделать:

  1. Вы хотите глобальную переменную, которая сохраняет свое значение от одного вызова функции к другому.
  2. Вы не хотите загрязнять глобальное пространство имен для этой новой переменной.
  3. Вам нравится идея инкапсуляции глобальных переменных, связанных с функцией, к которой они относятся.
  4. Вы хотите оптимизировать код, чтобы статические или константные объявления не переоценивались при каждом запуске функции.

В вашем примере вы видите преимущества всех четырех.

1
jfriend00 27 Янв 2013 в 05:02

Да, свойство функции / класса является статическим

MyClass.Description = "Dirty Business";

MyClass.staticFn = function() {

};

MyClass = function() {
  this.var = "test";
};

MyClass.prototype.instanceFn = function() {

};


// To call an instance function
obj = new MyClass();
obj.instanceFn();

// To call a static function
MyClass.staticFunction();

// Or to access a static property
alert(MyClass.Description)
1
Salman 27 Янв 2013 в 05:10