Javascript.RU

Оптимальное ООП с Google Closure Compiler

В javascript есть несколько основных стилей объявления объектов и свойств.
Они основаны на разной структуре кода, и поэтому - по-разному сжимаются компилятором.

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

Сжатие будет осуществляться продвинутым способом: --compilation_level ADVANCED_OPTIMIZATIONS.

Мы рассмотрим различные варианты ООП для виджета SayWidget с двумя приватными методами init, setElemById и публичным методом setSayHandler.

Кроме того, для проверки, как работает удаление недостижимого кода, в виджете будет присутствовать неиспользуемый метод unused

Первый стиль ООП основывается на классическом механизме наследования javascript, при котором свойства и методы берутся из прототипа.

function SayWidget(id) {
	this.setElemById(id)
	this.init()
}

SayWidget.prototype = {
	init: function() {
		this.elem.style.display = 'none'
	},
	setElemById: function(id) {
		this.elem = document.getElementById(elem)
	},
	setSayHandler: function() {
		this.elem.onclick = function() { 
			alert('hi')
		}
	},
	unused: function() { alert("unused") }
}

window['SayWidget'] = SayWidget
SayWidget.prototype['setSayHandler'] = SayWidget.prototype.setSayHandler

Результат сжатия:

function a(b) {
  this.c(b);
  this.b()
}
a.prototype = {b:function() {
  this.a.style.display = "none"
}, c:function() {
  this.a = document.getElementById(elem)
}, d:function() {
  this.a.onclick = function() {
    alert("hi")
  }
}};
window.SayWidget = a;
a.prototype.setSayHandler = a.prototype.d;

Как видно, все свойства. кроме экстернов, были заменены на короткие.
Что очень кстати, был удален неиспользуемый метод unused.

Этот метод, в принципе, аналогичен предыдущему, но методы добавляются в прототип по одному.

function SayWidget(id) {
	this.setElemById(id)
	this.init()
}

SayWidget.prototype.init = function() {
	this.elem.style.display = 'none'
}	
SayWidget.prototype.setElemById = function(id) {
	this.elem = document.getElementById(id)
}
SayWidget.prototype.setSayHandler = function() {
	this.elem.onclick = function() { 
		alert('hi')
	}
}
SayWidget.prototype.unused = function() { alert("unused") }

window['SayWidget'] = SayWidget
SayWidget.prototype['setSayHandler'] = SayWidget.prototype.setSayHandler

После сжатия:

function a(b) {
  this.a = document.getElementById(b);
  this.a.style.display = "none"
}
a.prototype.b = function() {
  this.a.onclick = function() {
    alert("hi")
  }
};
window.SayWidget = a;
a.prototype.setSayHandler = a.prototype.b;

А здесь - уже интереснее. Благодаря тому, что каждая функция описана отдельно, Google Closure Compiler может построить граф взаимодействий и заинлайнить функции. Что и произошло: в прототипе осталась только одна функция a.prototype.b (бывшая setSayHandler).

В результате размер существенно уменьшился.

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

В следующем коде находится два неиспользуемых метода unused: один публичный и один - приватный.

function SayWidget(id) {
    var elem
 
    setElemById(id)
    init()
 
    function init() {
        elem.style.display = 'none'
    }    
 
    function setElemById(id) {
        elem = document.getElementById(id)
    }    

    function unused() {
        alert("unused")
    }    
 
    this.setSayHandler = function() {
        elem.onclick = function() { 
            alert('hi')
        }
    }
    this.unused = function() { 
	alert("unused") 
    }

}
window['SayWidget'] = SayWidget

После сжатия:

function b(c) {
  function d() {
    a.style.display = "none"
  }
  function e(f) {
    a = document.getElementById(f)
  }
  var a;
  e(c);
  d();
  this.a = function() {
    a.onclick = function() {
      alert("hi")
    }
  };
  this.b = function() {
    alert("unused")
  }
}
window.SayWidget = b;

Этот стиль ООП обычно сжимается лучше прототипного, т.к. обычный компрессор (или Google Closure Compiler в безопасном режиме) сжимает только локальные переменные.

Но продвинутый режим Google Closure Compiler уравнивает локальные переменные с обычными (кроме экстернов) - он сжимает и то и другое.

Поэтому никакого преимущества этот стиль ООП не показал. Более того, в данном компилятору не удалось ни заинлайнить вызовы ни удалить неиспользуемый публичный метод.

Последний из рассматриваемых стилей работает без вызова оператора new. Он просто возвращает объект с нужными методами.

// object = sayWidget(id)
function sayWidget(id) {
	var elem
	
	setElemById(id)
	init()
	
	function init() {
		elem.style.display = 'none'
	}

	function setElemById(id) {
		elem = document.getElementById(id)
	}


	function unused() { 
		alert("unused") 
	}

	var me = {  // новый объект
		setSayHandler: function() {
			elem.onclick = function() { 
				alert('hi')
			}
		},
		unused: function() { 
			alert("unused") 
		}
	}
	me['setSayHandler'] = me.setSayHandler

	return me
}
window['sayWidget'] = sayWidget

После сжатия:

function c(a) {
  function d() {
    b.style.display = "none"
  }
  function e(f) {
    b = document.getElementById(f)
  }
  var b;
  e(a);
  d();
  a = {a:function() {
    b.onclick = function() {
      alert("hi")
    }
  }, b:function() {
    alert("unused")
  }};
  a.setSayHandler = a.a;
  return a
}
window.sayWidget = c;

Результат аналогичен предыдущему.

Победил в итоге, вот сюрприз, самый длинный способ - добавление каждого свойства через прототип кодом вида: SayWidget.prototype.methodXXX = ....

Более того, эта победа не случайна. Такой способ позволяет компилятору построить самый полный граф взаимодействий и произвести инлайны.
А определение функций в прототипе вместо замыкания - дает возможность успешно вырезать неиспользуемые символы. В результате - уменьшение размера кода.

В библиотеке Google Closure Library, под которую заточен Closure Compiler, используется именно такой стиль объявления свойств.


Автор: Alex S (не зарегистрирован), дата: 23 апреля, 2010 - 15:28
#permalink

На самом деле можно еще описать класс в таком стиле:

var oop = {};

(function (ns){

function KeyType() {}

/**
* @constructor
*/
function TestObject() {
this._markedObj = new KeyType()
}

TestObject.prototype = {
_markedObj : null,

doIt: function() {
opns.addEvent("keydown", function(obj) {
return obj instanceof KeyType
})
},

getMarked: function() {
return this._markedObj
},

dummy: function(event) {
opns.isEvent(event)
}
}

/* export TestObject */
ns.TestObject = TestObject
})(oop)

В данной записи пространство имен oop будет содержать "публичный" класс TestObject, который в свою очередь использует "приватный" класс KeyType. В данном случае closure сможет убрать, к примеру, метод dummy, если он не используется. И вообще, похоже, closure сможет выполнить все оптимизации за исключением одной - вызов функции вводящей определение TestObject не будет заинлайнен.

У приведенного кода есть только одно преимущество перед описанным добавлением через прототип - этот способ позволяет вводить приватные сущности, используемые публично видимыми классами (типа KeyType в описанном примере).


Автор: Зарегистрирован (не зарегистрирован), дата: 16 ноября, 2011 - 15:57
#permalink

К слову

a.prototype.b = ...;
a.prototype.setSayHandler = a.prototype.b;

- не полный аналог

a.prototype.setSayHandler = ...;

Полный аналог выглядел бы так:

a.prototype.b = ...;
a.prototype.setSayHandler = a.prototype.b;
delete a.prototype.b; // <<<<<

Короче, GCC не просто переименовывает свойства, а дублирует их, что теоретически может выйти боком, когда свойства по ходу дела меняются, или когда делается перебор свойств (например, для сериализации).


Автор: tyrus.mlearner (не зарегистрирован), дата: 2 февраля, 2012 - 13:21
#permalink

А что же делать, если unused - мое API в конструкторе для объекта, и самим объектом не используется, но используется внешним (либо другим js-кодом, либо даже flash'ом)? Получается он его похерит Sad


Автор: picos school (не зарегистрирован), дата: 9 июля, 2021 - 06:30
#permalink

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


Автор: Гость (не зарегистрирован), дата: 16 апреля, 2022 - 01:23
#permalink

Автор: Гость (не зарегистрирован), дата: 16 апреля, 2022 - 02:08
#permalink

Автор: Гость (не зарегистрирован), дата: 16 апреля, 2022 - 12:49
#permalink

Автор: ichylu (не зарегистрирован), дата: 5 октября, 2022 - 12:28
#permalink

Because all games in free games unblocked are currently unblocked, you might even utilize a smart device like a smartphone, iPad, or PC to play them at work or school.


Автор: allanpetter (не зарегистрирован), дата: 2 ноября, 2022 - 17:26
#permalink

This is a very great post and the way you express all your post details is too good. Thanks for sharing with us this useful post interior painting near me Raleigh NC


Автор: JellyMin (не зарегистрирован), дата: 10 мая, 2023 - 18:46
#permalink

In addition, to test how removing unreachable code works, the widget will have an unused methodunused drywall contractors dallas tx


Автор: kisytd (не зарегистрирован), дата: 15 мая, 2023 - 13:03
#permalink

what are you waiting for snake games? You should click and challenge any players in the world.


Автор: Peter Barnes (не зарегистрирован), дата: 14 июня, 2023 - 06:56
#permalink

There is nothing better than finding yourself a good game and playing at home on hot summer days. I recommend duck life to you.


Автор: oscardooley (не зарегистрирован), дата: 14 июня, 2023 - 07:31
#permalink

I appreciate you sharing the facts and advice, and I will take them into consideration. The game traffic jam 3d is fun which you can try wherever you want.


Автор: Mnlsoa (не зарегистрирован), дата: 14 июня, 2023 - 10:16
#permalink

A nagging sensation in the back of their heads compels them to come to a halt, but Riley is obligated to continue watching the tapes in amanda the adventurer


Автор: takehub (не зарегистрирован), дата: 30 июня, 2023 - 04:39
#permalink

Articles with very interesting topics. 8 ball pool


Автор: Гость (не зарегистрирован), дата: 20 июля, 2023 - 13:36
#permalink

All of the emoji characters are now accessible for you to copy and paste with ease (just copy them and then paste them into the editor of your choice).


Автор: leorasy (не зарегистрирован), дата: 1 августа, 2023 - 04:32
#permalink

Google Closure Compiler works well with modern stumble guys syntax, including classes. Using classes helps organize your code in a more structured and OOP-oriented manner.


Автор: Гость (не зарегистрирован), дата: 9 августа, 2023 - 06:55
#permalink

Excellent piece! This is a fantastic site that I plan on revisiting numerous times throughout the year. I appreciate your informative blog. mini crossword


Автор: JellyMin (не зарегистрирован), дата: 21 августа, 2023 - 17:46
#permalink

Кроме того, для проверки, как работает удаление недостижимого кода, в виджете будет присутствовать неиспользуемый метод unused sacramento ca drywall repair


Автор: Гость (не зарегистрирован), дата: 5 сентября, 2023 - 12:16
#permalink

This is a fantastic site that I plan on revisiting numerous slope


Автор: Binladen (не зарегистрирован), дата: 5 октября, 2023 - 10:48
#permalink

You have created a work that is very enjoyable to read, bringing enlightenment to every topic for us to acquire knowledge happy wheels. Thank you for sharing such information for us to read...


Автор: liam (не зарегистрирован), дата: 4 ноября, 2023 - 10:31
#permalink

I thoroughly enjoyed your article play wordle; it was captivating and made my morning coffee even more delightful. Thank you for sharing such a high-quality piece.


Автор: 먹튀신고 (не зарегистрирован), дата: 14 ноября, 2023 - 07:50
#permalink

Be able to create comparative themes with pleasure! Welcome here and you will discover what it should look like.먹튀신고


Автор: taniyuki (не зарегистрирован), дата: 27 февраля, 2024 - 08:33
#permalink

tiny fishing - Simple, pleasant and so good


Автор: jess (не зарегистрирован), дата: 24 апреля, 2024 - 09:43
#permalink

This can certainly happen moto x3m


Автор: Гость (не зарегистрирован), дата: 4 мая, 2024 - 06:02
#permalink

Very interesting article. This is my first time coming here fnaf. I found a lot of interesting things in your blog, especially the discussion therein. Thanks for the post! retro games


Автор: frg3 (не зарегистрирован), дата: 14 мая, 2024 - 06:57
#permalink

It gives me great pleasure to convey my sincere gratitude for the outstanding quality of the previously mentioned products. The writer has produced a remarkable and thought-provoking work that exhibits a strong command of language and the capacity to organize thoughts. papa's freezeria


Автор: Гость (не зарегистрирован), дата: 12 октября, 2024 - 04:09
#permalink

Playing Sprunki Incredibox allows you to experiment with beats, melodies, and effects, offering endless possibilities for musical creation.


Автор: Гость (не зарегистрирован), дата: 17 октября, 2024 - 11:43
#permalink

Sprunki Incredibox is a fan-created modification of the original Incredibox game, developed by passionate community members. This mod enhances the core gameplay with fresh soundscapes, unique visuals, and exciting new characters. Players can mix and match various beats, melodies, and effects to create their own musical masterpieces.


Автор: Sprunki Incredibox (не зарегистрирован), дата: 20 октября, 2024 - 15:22
#permalink

If you're into creative music games, you should definitely check out Sprunki Incredibox! It’s an amazing way to mix and match beats.


Автор: Sprunki Incredibox (не зарегистрирован), дата: 20 октября, 2024 - 15:22
#permalink

If you're into creative music games, you should definitely check out Sprunki Incredibox! It’s an amazing way to mix and match beats.


Автор: Гость (не зарегистрирован), дата: 21 октября, 2024 - 14:00
#permalink

Tap Road encourages players to improve their reflexes and concentration.


Автор: Гость (не зарегистрирован), дата: 22 октября, 2024 - 14:28
#permalink

Dive into Sprunki Incredibox, a user-friendly music-mixing game that expands on the original with exciting new elements.


Автор: Гость (не зарегистрирован), дата: 25 октября, 2024 - 08:49
#permalink

Discover exciting online experiences with a variety of engaging platforms. Start by visiting Chat Gratuito for real-time conversations with friends. If you're into music, try creating unique beats on Incredibox Sprunki. For those who love adrenaline, enjoy the thrill of racing on Moto X3 Unblocked or test your agility in Parkour Civilization. Winter sports enthusiasts can have fun with Sled Rider 3D and Snow Rider 3D. If you are looking for casual games, explore the world of Sprunki Game or sharpen your reflexes in Stickman Hook Unblocked. These platforms promise endless fun and entertainment for all!


Автор: Гость (не зарегистрирован), дата: 25 октября, 2024 - 12:39
#permalink

Looking for a diverse range of AI tools and entertainment? Explore sites like nudeai.beauty and uncensoredai.cc for unique AI-generated content. Try aihentaigenerator.fun and its extension stable-diffusion-hentai.aihentaigenerator.fun for specialized image generation. If visual creativity interests you, visit bingimagecreator.online or nsfwaiart.art. For interactive chats, check out nsfw-ai-chatbot.online or engage with the community at nsfwai.world.

Discover useful AI directories at aitoolsdirectory.online and explore productivity apps like viggleai.live, tdeecalculator.online, calculatorapp.online, and compoundinterestcalculator.site. Dive into creative writing at aistorygenerator.fun and explore LLaMA's capabilities on llamaai.online. If you love AI-generated art, don't miss aiartfree.online.

Explore more mystical content at cekkhodam.co, and use ai-detector.online to check for AI content. Design engaging covers at aicover.fun and experiment with AI-powered generators at flux-ai.online and bratgenerator.org. Enhance your writing with aitextgenerator.live and learn about new releases on blackmythwukong.buzz.

For book lovers, booksummary.wiki offers concise insights. Get access to AI chat services at chatgptgratuit.chat and chatgtponline.com. Discover Thai-based services on gauthai.pro, and explore recipes at bestrecipe.pro. Finally, satisfy your gaming needs with cookie-clicker-unblocked.pro and enhance your creativity with freakyfont.org.


Автор: SarahDBerry (не зарегистрирован), дата: 27 октября, 2024 - 02:16
#permalink

There are many people who want to find more updates about this oops, and it is good to see the details here. By using the colorbond roof repair I saw a lot of great services that are providing us the right results.


Автор: How Old Do I Look (не зарегистрирован), дата: 28 октября, 2024 - 09:36
#permalink

This tool, How Old Do I Look, uses facial recognition to estimate your age. Perfect for some light-hearted fun!


Автор: Гость (не зарегистрирован), дата: 29 октября, 2024 - 09:11
#permalink

Play Escape Road Game free and unblocked online ???? Escape games with fast driving challenges. Unlock cars like Ford Escape & dodge police terrains at school.

Play Sprunki Sprunked, the music game mod by Incredibox. Characters from sprunki, sprunked, and sprunki incredibox. Enjoy the free Sprunked Daytime Demo online.

Play Incredibox Abgerny game online free, with Abgerny Sprunki Mod and Cocrea. Explore sprunki incredibox and incredibox mod games along with abgerny wiki.


Автор: Гость (не зарегистрирован), дата: 4 ноября, 2024 - 13:37
#permalink

Immerse yourself in creative gaming worlds at https://sprunki-phase.online/
When playing online games, there are plenty of fun options to explore. First, try out https://block-blast.pro/, a free online Tetris puzzle game. Next, enjoy https://trafficracer.online/, where you can play free 3D racing car games. Don’t miss https://sprunkiparasite.com, which offers exciting Parasprunki Mod games, and finally, check out https://footballbros.online/, where you can dive into a world of football games and endless soccer fun.


Автор: Гость (не зарегистрирован), дата: 4 ноября, 2024 - 13:38
#permalink

Immerse yourself in creative gaming worlds at https://sprunki-phase.online/


Автор: Гость (не зарегистрирован), дата: 6 ноября, 2024 - 15:05
#permalink

Sprunki Phase Games brings fan-created twists to Incredibox, merging creative music-making with fresh gameplay.


Автор: Sprunki Phases (не зарегистрирован), дата: 6 ноября, 2024 - 15:55
#permalink

Sprunki Phases brings together various popular versions of the Sprunki games, including Sprunki Phase 3, Sprunki Phase 4, and so on.


Автор: Гость (не зарегистрирован), дата: 7 ноября, 2024 - 06:32
#permalink

WEBFISHING is more than just casting a line. Jump into a sandbox environment where you can play the guitar, draw with chalk, and even have a bit of playful fun with your friends. This interactive space adds a creative and lighthearted touch to your fishing adventure, allowing you to unwind and enjoy the world in your own way.


Автор: Sprunki Retake (не зарегистрирован), дата: 11 ноября, 2024 - 15:20
#permalink

Experience the future of music-making with Sprunki Retake, blending innovation, dynamic sounds, and interactive entertainment like never before.


Автор: Гость (не зарегистрирован), дата: 14 ноября, 2024 - 09:13
#permalink

Play https://sprunkiretake.online Incredibox Phases Horror Mod Games
Sprunki Mustard ???? Play Incredibox Mustard Sprunki Mod Games https://sprunki-mustard.online/

Download https://pvz-fusion.online PVZ Fusion Super Hybrid Mod APK & PC Game
Get https://airlinebutler.fun Airline Butler Streaming App for Movies & TV Shows
Play https://myfemboy-roommate.com My Femboy Roommate Online, Free Download APK & PC
Download https://homicipher.fun Homicipher APK Game for Android & PC


Автор: Sprunki Incredibox (не зарегистрирован), дата: 17 ноября, 2024 - 11:29
#permalink

sprunki A super fun music-making website where you can create your own beats by dragging and dropping different characters. Each character makes unique sounds like beatbox, vocals, or effects. You can mix up to 8 different sounds to make cool music loops. It's really easy to use - no music skills needed! You can even record and save your creations to share with others. Perfect for killing time and getting creative with music.


Автор: Гость (не зарегистрирован), дата: 17 ноября, 2024 - 17:03
#permalink

Unleash your musical genius with FiddleBops Incredibox, on https://fiddlebopsincredibox.org/


Автор: Гость (не зарегистрирован), дата: 17 ноября, 2024 - 17:04
#permalink

Try this sprunki game: Sprunked 2.0
https://sprunked2.com


Автор: Гость (не зарегистрирован), дата: 18 ноября, 2024 - 12:19
#permalink

[html]

Incredibox Mustard

Dive into the world of Incredibox Mustard, where creative music-making meets stunning visuals in this innovative fan-made expansion.[html]


Автор: Гость (не зарегистрирован), дата: 18 ноября, 2024 - 12:20
#permalink
<p><a href="https://retrobowl25.org/">Retro Bowl 25</a></p> 

Immerse yourself in the perfect blend of retro gaming charm and modern football strategy in this captivating 8-bit sports experience.

Автор: Гость (не зарегистрирован), дата: 18 ноября, 2024 - 12:22
#permalink
<p><a href="https://sprunkiphaseincredibox.com/">Sprunki Phase Incredibox</a></p> 

Play Sprunki Phase Incredibox, a fan-made mod of Incredibox.

https://sprunkiphaseincredibox.com/


Автор: Гость (не зарегистрирован), дата: 18 ноября, 2024 - 12:23
#permalink
<p><a href="https://retrobowl25.org/">Retro Bowl 25</a></p> 

Immerse yourself in the perfect blend of retro gaming charm and modern football strategy in this captivating 8-bit sports experience.

https://retrobowl25.org/


Автор: Гость (не зарегистрирован), дата: 18 ноября, 2024 - 12:24
#permalink

Автор: Гость (не зарегистрирован), дата: 18 ноября, 2024 - 17:12
#permalink

All Active Anime Reborn Codes https://animereborncodes.com , November 2024 ???? Latest Code
The Rise of the Golden Idol https://theriseofthegoldenidol.com/ ???? Walkthrough & Play The Case


Автор: Sprunki Sinner (не зарегистрирован), дата: 21 ноября, 2024 - 07:36
#permalink

Explore the joy of music creation with Sprunki Sinner Edition's innovative tools, charming characters, and unique sounds.


Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
6 + 5 =
Введите результат. Например, для 1+3, введите 4.
 
Текущий раздел
Поиск по сайту
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Последние комментарии
Последние темы на форуме
Forum