Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Learning to Fly — Twitter Flight and Mixins
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Angus Croll
August 23, 2013
Technology
4.8k
23
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Learning to Fly — Twitter Flight and Mixins
Presented at BrazilJS, Porto Alegre, August 22nd 2013
Angus Croll
August 23, 2013
More Decks by Angus Croll
See All by Angus Croll
The Book Nerd's Guide to JavaScript
anguscroll
14
4.4k
Stop being Perfect
anguscroll
11
1.7k
ES6 Uncensored
anguscroll
72
12k
JavaScript is Literature is JavaScript
anguscroll
21
3.6k
The Politics of JavaScript
anguscroll
122
23k
Parlez-Vous JavaScript
anguscroll
33
6.4k
Break all the Rulez
anguscroll
42
16k
How we Learned to Stop Worrying and Love JavaScript
anguscroll
90
22k
Other Decks in Technology
See All in Technology
beyond jj: config & tools ecosystem
indirect
0
4.8k
Issue 駆動でスペシャリストの意図を届ける、AI 実装のアクセシビリティ向上
thkt
0
120
Cloudflare Workers 向けアプリを C# で構築する ~WASM Native AOT への道~
nenonaninu
1
420
Minecraft JavaのMODをSwiftで作る
1mash0
0
180
2026-09-18 gotanda.sre Terraformで複数環境作ったり、複数Stateに分割したりそれとTerragrunt / Terraform multi envs and multi states
masasuzu
2
540
The Knowledge Spine: A Machine-Executable Ontology for Governed Marketing Activation
vananth22
0
110
なぜ「決定性」が 決定的に重要なのか? Durable Execution 基盤の数理的理解 #serverlessjp / ServerlessDays Tokyo 2026
ytaka23
3
680
あけおめLINE 傾向とその対策
nasa9084
0
150
品質と信頼性を地続きにする
grimoh
1
790
フルカイテン株式会社 エンジニア向け採用資料
fullkaiten
0
12k
積み重なった技術負債への挑戦 〜初手としての全社ゴト化〜
techtekt
PRO
0
1.3k
ADKで始める業務改善 - AIエージェント開発時の考えと設計
harappa80
2
220
Featured
See All Featured
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
530
Context Engineering - Making Every Token Count
addyosmani
9
1.1k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.4k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.2k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
550
Designing for humans not robots
tammielis
254
26k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
2.9k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
410
Transcript
Learning to fly Twitter Flight and Mixins @angustweets Thursday, August
22, 13
the most difficult part of JS inheritance... And on the
6th day, God created an abundance of Talking Animals, that they may be used in JavaScript inheritance examples. Thursday, August 22, 13
So, talking animals it is! meow!! Thursday, August 22, 13
Flight flightjs.github.io An event driven web framework by Twitter Thursday,
August 22, 13
Flight powers... twitter.com tweetdeck gumroad yinzcam crashalytics and more... Thursday,
August 22, 13
A set of components which bind functionality to DOM Nodes...
Thursday, August 22, 13
github.com/flightjs/example-app Thursday, August 22, 13
github.com/flightjs/example-app Thursday, August 22, 13
Components are completely decoupled and communicate via event bubbling Thursday,
August 22, 13
Thursday, August 22, 13
Components often share behaviours Thursday, August 22, 13
Components often share behaviours So we needed a re-use technique
Thursday, August 22, 13
Inheritance classical composition mixins Functions Object.create Constructor.prototype function passing /
callbacks Objects call/apply functional mixins (Some) JavaScript Re-use Patterns Thursday, August 22, 13
Inheritance classical composition mixins Functions Object.create Constructor.prototype function passing /
callbacks Objects call/apply functional mixins (Some) JavaScript Re-use Patterns Thursday, August 22, 13
Classical Inheritance Thursday, August 22, 13
ES 6 is giving us class. Some libraries have their
own versions. Thursday, August 22, 13
implementation varies widely and abstraction is often leaky (const, static)
class, extend and super are reserved words in particular, the relationship between this and super is difficult... Thursday, August 22, 13
//Prototype.js var SwimmingAnimal = Class.create(Animal, { type: 'SwimmingAnimal', speak: function($super)
{ return $super() + ", glug"; } }); //https://github.com/ded/klass var Alien = SuperHuman.extend({ speak: function() { this.supr(); //speak like a SuperHuman } }); Thursday, August 22, 13
Do you even want classes? Thursday, August 22, 13
Animal Walking Animal Swimming Animal Flying Animal Cat Elephant Crocodile
Whale Eagle Bat Egg-laying Animal Migrating Animal Thursday, August 22, 13
Crocodile Animal Walking Animal Swimming Animal Flying Animal Cat Elephant
Whale Eagle Bat Egg-laying Animal Migrating Animal Thursday, August 22, 13
Crocodile Animal Walking Animal Swimming Animal Flying Animal Cat Elephant
Whale Eagle Bat Egg-laying Animal Migrating Animal WTF? I walk too!! Thursday, August 22, 13
Animal Walking Animal Swimming Animal Flying Animal Cat Elephant Crocodile
Whale Eagle Bat Egg-laying Animal Migrating Animal Thursday, August 22, 13
Duck? Animal Walking Animal Swimming Animal Flying Animal Cat Elephant
Crocodile Whale Eagle Bat Egg-laying Animal Migrating Animal Thursday, August 22, 13
Duck? Animal Cat Elephant Crocodile Whale Eagle Bat Thursday, August
22, 13
Duck? Animal Cat Elephant Crocodile Whale Eagle Bat Walking Animal
Swimming Animal Flying Animal Egg-laying Animal Migrating Animal Thursday, August 22, 13
Classical inheritance Requires up-front knowledge of general case Single rooted
hierarchy We’re really bad at classification Thursday, August 22, 13
Constructor.prototype chaining Thursday, August 22, 13
awkward and unnatural Thursday, August 22, 13
var Animal = function(gender, says) { this.gender = gender; this.says
= says; }; var WalkingAnimal = function(gender, says) { Animal.call(this, gender, says); } WalkingAnimal.prototype = new Animal(); Thursday, August 22, 13
...and new Constructor syntax is classical inheritance Thursday, August 22,
13
Beyond classification... Thursday, August 22, 13
19th century British philosophers Whewell and Jevons argued that there
are no objectively “right” classifications Thursday, August 22, 13
“In general, when working with prototypes, one typically chooses not
to categorize but to exploit alikeness.” –Antero Taivalsaari (Nokia Research Center) Thursday, August 22, 13
liberates prototype chaining from classification Object.create Thursday, August 22, 13
var animalProto = { speak: function() { console.log(this.says); } }
var walkingAnimalProto = Object.create(animalProto); // then augment walkingAnimalProto here... Thursday, August 22, 13
but, that second argument :’’( Thursday, August 22, 13
var animalProto = { speak: function() { console.log(this.says); } }
var walkingAnimalProto = Object.create( animalProto, { walk: { value: function() { console.log('walking'); } } //... } ); Thursday, August 22, 13
and inheritance is still single rooted Thursday, August 22, 13
The sad thing is that we even care about inheritance
hierarchies... Thursday, August 22, 13
The sad thing is that we even care about inheritance
hierarchies... ...because in JavaScript they’re quite unnecessary... Thursday, August 22, 13
JavaScript has first class functions Any function can be assigned
to any object Thursday, August 22, 13
Mixins Thursday, August 22, 13
//A property copy mixin var withWalking = { walk: function()
{ console.log('walking'); }, turn: function(direction) { console.log('turning', direction); }, stopWalking: function() { console.log('stopped walking'); } }; Thursday, August 22, 13
var extend = function(destination, source) { for (var k in
source) { if (source.hasOwnProperty(k)) { destination[k] = source[k]; } } return destination; }; extend(Crocodile.prototype, withWalking); extend(Crocodile.prototype, withSwimming); Thursday, August 22, 13
No hierarchical constraints Functionality is grouped by what it does
not who it belongs to Define special cases first; common code later Thursday, August 22, 13
Mixin must know about target Properties can only clobber But...
Thursday, August 22, 13
Functional Mixins Thursday, August 22, 13
var withWalking = function() { this.walk = function() { console.log('walking');
}; this.turn = function(direction) { console.log('turning', direction); }; this.stopWalking = function() { console.log('stopped walking'); }; }; Thursday, August 22, 13
function Crocodile(name, gender) { this.name = name; this.gender = gender;
} Crocodile.prototype.stalkTourists = function() { //.. }; withWalking.call(Crocodile.prototype); withSwimming.call(Crocodile.prototype); Thursday, August 22, 13
Flight uses functional mixins Thursday, August 22, 13
github.com/flightjs/example-app Thursday, August 22, 13
function withSelect() { this.defaultAttrs({ selectedIds: [] }); this.selectItem = function($item,
append) { $item.addClass(this.attr.selectedClass); this.attr.selectedIds.push($item.attr('id')); this.trigger('uiSelectionChanged', {selIds: this.attr.selectedIds}); }; this.unselectItem = function($item) { $item.removeClass(this.attr.selectedClass); this.attr.selectedIds.splice(getIdIndex($item), 1); this.trigger('uiSelectionChanged', {selIds: this.attr.selectedIds}); }; } Thursday, August 22, 13
defineComponent(mailItems, withSelect); defineComponent(folders, withSelect); defineComponent(moveToSelector, withSelect); Thursday, August 22, 13
The Advice Mixin Thursday, August 22, 13
advice.js is a mixin Thursday, August 22, 13
advice.js is a mixin it lets you add custom code
before(), after() or around() an existing function. Thursday, August 22, 13
all flight mixins get advice.js for free Thursday, August 22,
13
all flight mixins get advice.js for free so mixins can
augment functions, not clobber them Thursday, August 22, 13
withAdvice.call(Crocodile.prototype); function withFlu() { this.before('walk', function() { console.log('sniff'); }); }
var sickCrocodile = new Crocodile(); withFlu.call(sickCrocodile); sickCrocodile.walk(); //"sniff, pad, pad, pad, pad" Thursday, August 22, 13
function withSelect() { this.defaultAttrs({ selectedIds: [] }); this.toggleItemSelect = function(ev,
data) { var $item = $(data.el), append; if ($item.hasClass(this.attr.selectedClass)) { this.unselectItem($item); } else { this.selectItem($item, isMultiSelect(ev)); } }; this.selectItem = function($item, append) {/*..*/}; this.unselectItem = function($item) {/*..*/}; this.after('initialize', function() { this.on(this.select('itemSelector'), 'click', this.toggleItemSelect); }); } Thursday, August 22, 13
So why do we like functional mixins? Thursday, August 22,
13
Mixins as verbs instead of nouns. Mixins are functions. We
can take advantage of closure scope and arguments. A mixin can be applied to any object type: prototype, instance, whatever. Advice allows functional mixins to augment existing functions, not clobber them. Thursday, August 22, 13
Works with the language Simple to understand No surprises! Thursday,
August 22, 13
Obrigado! @angustweets javascriptweblog.wordpress.com/2011/05/31/a-fresh-look-at- javascript-mixins/ Thursday, August 22, 13