SlideShare a Scribd company logo
プロパティディスクリプ
タとその拡張ライブラリ
Gunma.web #14 発表
お前誰よ?
• 村岡友介
• @jbking
• Python!
• Python!!
• Python!!!
• JavaScript
• jQuery使い
ECMA-262 5.1
ECMAScript
Property Descriptor
Property
Descriptor?
• オブジェクトごとの
プロパティの挙動を
記述
• value
• writable
• enumerable
• configurable
• setter/getter foo.bar
オブジェクト プロパティ
Object.defineProperty(foo, ‘bar’, {
get: function() {
return ‘baz’;
},
set: function(v) {
console.log(v);
}
});
foo.bar
‘baz’
foo.bar = ‘qux’
qux // console.log
‘qux’
foo.bar
‘baz’
Property
Descriptor?
• オブジェクトごとの
プロパティの挙動を
記述
• value
• writable
• enumerable
• configurable
• setter/getter
ここまでが基本
BeautifulProperties.js
Hookable
LazyInitializable
Events
Observable
Versionizable
https://github.com/monjudoh/BeautifulProperties.js/
BeautifulProperties.LazyInitializable.define(
object,
‘key’,
{
init: function () {
console.log(‘initialized’);
return 1;
}
}
);
object.key
initialized // console.log
1
LazyInitializable
• 初期化を遅延させる
BeautifulProperties.Hookable.define(
object,
‘key’,
{
beforeGet: function () { console.log(‘beforeGet’); },
afterGet: function (v) { console.log(‘afterGet’, v); },
beforeSet: function (v, p) { console.log(‘beforeSet’, v, p); },
afterSet: function (v, p) { console.log(‘afterSet’, v, p); }
}
);
object.key
beforeGet // console.log
afterGet undefined // console.log
undefined
object.key = 10
beforeSet 10 undefined // console.log
afterSet 10 undefined // console.log
10
Hookable
• getter/setterの直前
と直後にそれぞれ
フックを仕込める
• 値の変更も
BeautifulProperties.Events.on(object, ‘event1’,
object,
‘event1’,
function () {
console.log(‘event1 called’);
}
);
BeautifulProperties.Events.trigger(object, ‘event1’)
event1 called // console.log
undefined
Events
• オブジェクトに対し
てイベントをはれる
• jQ.on/jQ.triggerのよ
うなもの
• プロトタイ
プへ伝播
BeautifulProperties.Observable.define(
object,
‘key’
);
BeautifulProperties.Events.on(
object,
‘change:key’,
function (_ev, v, p) {
console.log(‘key is changed’, v, ‘from’, p);
}
);
object.key = ‘foo’
key is change foo from undefined // console.log
‘foo’
Observable
• プロパティの変更で
イベントを発行でき
る
BeautifulProperties.Versionizable.define(
object,
‘key’
);
object.key = ‘foo’
‘foo’
object.key = ‘bar’
‘bar’
BeautifulProperties.Versionizable.getVersions(
object,
‘key’)
[ { value: ‘bar’, timestamp: 1379121665980 },
{ value: ‘foo’, timestamp: 1379121662234 } ]
Versionizable
• プロパティの変更を
履歴として保存でき
る
• 履歴改変もできる
一つのプロパティに対して
組み合わせられます
Hookable
LazyInitializable
Events
Observable
Versionizable
BeautifulProperties.Observable.define(
object,
‘key’
);
BeautifulProperties.Versionizable.define(
object,
‘key’
);
BeautifulProperties.Events.on(
object,
‘change:key’,
function () { console.log(‘key is change’); }
);
object.key = ‘foo’
key is changed // console.log
‘foo’
BeautifulProperties.Versionizable.getVersions(
object,
‘key’)
[ { value: ‘foo’, timestamp: 1379121662234 } ]
組み合わせ例
• プロパティの変更を
履歴取りながらイベ
ント発行する
以上。

More Related Content

PDF
20140930 anything as_code
PPTX
はじめての datadog
KEY
Chiba pm#1 - ArangoDB for Perl
PDF
200k/sec
PDF
BMXUG つきじ#4
PDF
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
PDF
(きっと)あなたにも出来る!Hyperledger composer でブロックチェーンアプリを動かしてみた
PDF
後期第三回ネットワークチーム講座資料
20140930 anything as_code
はじめての datadog
Chiba pm#1 - ArangoDB for Perl
200k/sec
BMXUG つきじ#4
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
(きっと)あなたにも出来る!Hyperledger composer でブロックチェーンアプリを動かしてみた
後期第三回ネットワークチーム講座資料

What's hot (19)

PDF
Crawler Commons
PDF
ng-japan 2015 TypeScript+AngularJS 1.3
PDF
Lightweight C#
PDF
202003 functiontalkinnotesknowsworkshop20th
PDF
My misstake on Ansible’s lineinfile module
PDF
202006 のの会@関数Talk 21st @function-talk-in-notesknows-workshop
PDF
Elixir Meetup #1 Loggerの構造と拡張
PPTX
redashのプラベートカタログ作成してつまづいたアレやコレや
PDF
Capistrano紹介 at kawasaki.rb #002 #kwskrb
PPTX
Web Workers
PDF
Jenkinsで行う並列テスト(公開用)
PDF
Ruby Sapporo Night Vol.4
PDF
Ruby/Rails Benchmarking and Profiling with TDD
PDF
Active job meets kubernetes
PDF
スクリプトエンジンをつくる話
PPTX
20161208 Classmethod Codenize Tools
PPTX
HerokuMeetupCuon
PPT
Cubby-2008-01-15 OT
PDF
Ruby風Swift NSOperation編
Crawler Commons
ng-japan 2015 TypeScript+AngularJS 1.3
Lightweight C#
202003 functiontalkinnotesknowsworkshop20th
My misstake on Ansible’s lineinfile module
202006 のの会@関数Talk 21st @function-talk-in-notesknows-workshop
Elixir Meetup #1 Loggerの構造と拡張
redashのプラベートカタログ作成してつまづいたアレやコレや
Capistrano紹介 at kawasaki.rb #002 #kwskrb
Web Workers
Jenkinsで行う並列テスト(公開用)
Ruby Sapporo Night Vol.4
Ruby/Rails Benchmarking and Profiling with TDD
Active job meets kubernetes
スクリプトエンジンをつくる話
20161208 Classmethod Codenize Tools
HerokuMeetupCuon
Cubby-2008-01-15 OT
Ruby風Swift NSOperation編
Ad

Viewers also liked (6)

PDF
The Substance D - Plone Symposium Tokyo 2015
PDF
Debug it-python-hack-a-thon-2011.02
PPTX
Django learning
PDF
PDF
App Engineと非同期とテストと私
PPTX
Django learning Part2
The Substance D - Plone Symposium Tokyo 2015
Debug it-python-hack-a-thon-2011.02
Django learning
App Engineと非同期とテストと私
Django learning Part2
Ad

More from Yusuke Muraoka (9)

PDF
いかにして問題をとくか
PDF
Pythonistaで始めるiOSプロトタイプ開発
PDF
私のPythonとの関わりかた
PDF
Substance D world-plone-day-2017
PDF
Pythonistaの使い方
PDF
Gunma.web #24 MySQL HA
KEY
Pyramid Security
PDF
Some about chef
ODP
Can A Python Go Beyond The Python
いかにして問題をとくか
Pythonistaで始めるiOSプロトタイプ開発
私のPythonとの関わりかた
Substance D world-plone-day-2017
Pythonistaの使い方
Gunma.web #24 MySQL HA
Pyramid Security
Some about chef
Can A Python Go Beyond The Python

プロパティディスクリプタとその拡張ライブラリ