Итак, что я вижу в других ответах, так это в том, что они не отвечают фундаментальным архитектурным требованиям статического атрибута в объектно-ориентированном программировании.
Объектно-ориентированное программирование на самом деле имеет два разных стиля, один из которых «основан на классах» (C ++, C #, Java и т. Д.), Другой - «прототип» (Javascript). В языках на основе классов предполагается, что «статический атрибут» связан с классом, а не с объектами, для которых он создан. Эта концепция на самом деле работает намного более интуитивно в прототипных языках, таких как Javascript, потому что вы просто присваиваете атрибут как значение родительского прототипа, вот так.
function MyObject() {};
MyObject.prototype.staticAttribute = "some value";
И получить к нему доступ из каждого объекта, который создается из этого конструктора, например ...
var childObject1 = new MyObject(); // Instantiate a child object
var childObject2 = new MyObject(); // Instantiate another child object
console.log(childObject.staticAttribute); // Access the static Attribute from child 1
console.log(childObject.staticAttribute); // Access the static Attribute from child 2
Теперь, если вы продолжите и измените MyObject.prototype.staticAttribute
, изменение будет каскадно касаться дочерних объектов, которые сразу же наследуют его.
Однако есть несколько «уловок», которые могут существенно подорвать «статическую» природу этого атрибута или просто оставить уязвимость безопасности ...
Сначала убедитесь, что конструктор скрыт из глобального пространства имен, заключив его в другую функцию, такую как метод готовности jQuery
$(document).ready(function () {
function MyObject() {
// some constructor instructions
};
MyObject.prototype.staticAttribute = "some value";
var childObject = new MyObject(); // instantiate child object
console.log(childObject.staticAttribute); // test attribute
});
Во-вторых, и, наконец, даже если вы сделаете это, атрибут все равно будет редактироваться из любой другой части вашего собственного скрипта, поэтому может случиться так, что ошибка в вашем коде записывает поверх атрибута одного из дочерних элементов. Объекты и отсоединяет его от родительского прототипа, поэтому если вы измените родительский атрибут, он больше не будет каскадно и не изменит статический атрибут для дочернего объекта. См. Это jsfiddle. В различных сценариях мы могли бы либо Object.freeze(obj)
остановить любые изменения дочернего объекта, либо мы могли бы установить метод setter и getter в конструкторе и получить доступ к замыканию, оба из которых имеют сопутствующие сложности.
Мне кажется, что нет идеального аналога между основанной на классе идеей «статического атрибута» и этой реализацией Javascript. Поэтому я думаю, что в конечном итоге было бы лучше использовать другой шаблон кода, более дружественный к Javascript. Например, центральное хранилище данных или кэш или даже выделенный вспомогательный объект для хранения всех необходимых статических переменных.