Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
ECMAScript
没Proposal追悼式
tyage@KMC
本日はお集まりいただき
ありがとうございます
司会担当
● id: tyage
● 京大工学部情報学科3回
● JavaScriptとか書いてる
● 趣味
○ 脆弱性報告
○ CTF
司会担当
ECMAScriptとは
● JavaScriptやActionScriptの実装基盤となっている言語
● Ecma Internationalによって標準化される
● (例会講座でも一度紹介しました)
ECMAScript標準化の流れ
● Strawman(仕様提案)
● →Proposal(具体化・デモ・試案)
● →Draft(仕様書作成)
○ イマココ
○ 3/4にRC2が出来た
● →Candidate(実装・フィードバック)
● →...
ECMAScript Proposalとは
● 様々な人から仕様に入れてほしい提案(Proposal)が送られ
てくる
○ 提案を検討して、仕様に組み込んだり却下したり
○ Proposalフェーズでなくても送られてくる
採用されたECMAScript Proposal
● ECMAScript6勉強会でやりました
○ class
○ generator
○ Symbol
○ Map
○ const
○ Promise
○ Proxy
○ etc...
今日話すこと
● Proposalだったが、ECMAScript6の仕様書(RC2)に入らな
かったもの(死者)を一部紹介
○ ※覚えてもメリットはないかも
● 英語の誤訳が多数含まれているかと思いますがご了承下さ
い
1つ目
"use" keyword
"use" keyword
● https://esdiscuss.org/topic/proposal-use-keyword
○ 生年月日: 2014年7月25日
○ 没年月日: 2014年7月26日
● 「なんでPHPの”use”みたいな...
なんだそれは???
"use" keyword
● PHP5.3くらいから追加されてたkeyword
● 無名関数を宣言する際に、親のスコープから変数を引き継
ぐことができる
○ こんな機能使ったことないし知らなかったゾ...
"use" keyword
> // 通常、無名関数は外のスコープの変数を参照できない
> $message = ‘hoge’;
> $fun = function() { echo $message; };
> $fun();
PHP Not...
"use" keyword
> // use keywordを使うと外のスコープの変数が参照できる
> $message = ‘hoge’;
> $fun = function() use ($message) { echo $message;...
なるほど
一方ECMAScriptでは
// 暗黙的に外のスコープの変数を見に行く
var message = 'hoge';
var fun = function() { console.log(message); };
fun();
hoge
あれ、”use” keyword要らなくね?
どうやらそうではないらしい
引数を使わず、関数から別スコープにあるローカル変数が参照
したいようだ
(追記: dynamic scopeというらしい)
どうやらそうではないらしい
function fun1() {
var message = ‘hoge’;
fun2.attachContext();
};
function fun2() {
console.log(message);
};
...
えっ、何これは・・・(ドン引き
皆様の反応
● PHP関係ないやんけ
● 何がしたいのかわからん
皆様の反応
● デメリットのほうが圧倒的に大きいのでは
○ 人間もコンピュータも解析しづらい
● どう考えてもダメ
ご愁傷さまです
2つ目
typeof null
typeof null
● http://wiki.ecmascript.org/doku.php?id=harmony:
typeof_null
● typeof null が “null” を返すようにしてほしいという提案
typeof演算子
● オブジェクトやプリミティブ値のデータ型を文字で返す
typeof 37 === “number”
typeof “hoge” === “string”
typeof {a: 1} === “object”
typeof ...
typeof null === ???
ではこれは何になるでしょうか
typeof null
typeof null === ???
ではこれは何になるでしょうか
typeof null === “object”
※nullはプリミティブ値です
どうしてこうなった
歴史的経緯
初期のJavaScriptの実装では各値の32bit領域中に以下の
type tagデータが入っていた
http://www.2ality.com/2013/10/typeof-null.html
● 000: object
● 1...
歴史的経緯
typeof演算子はtype tagでチェックしていた
if (JSVAL_IS_VOID(v)) {
type = JSTYPE_VOID;
} else if (JSVAL_IS_OBJECT(v)) {
…
type = JS...
歴史的経緯
nullはnull pointer(0x00)で表されていたので、type tagが
objectと同じになる!!
→ typeof null === “object”
歴史的経緯
Brendan Eichが納期に追われて作ってしまったらしい...
糞言語かよ!!
typeof null
● 10年くらい前からtypeof nullが”null”を返すように変更する
かは議論されていた
○ http://wiki.ecmascript.org/doku.php?id=discussion:typeof
typeof null
● 当然ECMAScript6で修正しようという風潮はあったが...
○ V8では実装されていたらしい
typeof null
● typeof nullが”object”を返すことに依存したコードが多く存
在した
○ このまま仕様を変えると古いWebページが見れなくなるかも
○ 古いコードの解釈が変わらないようにしないといけない
■ 前方互換性
typeof null
● typeof nullが”object”を返すことに依存したコードが多く存
在した
○ このまま仕様を変えると古いWebページが見れなくなるかも
○ 古いコードの解釈が変わらないようにしないといけない
■ 前方互換性
手遅れ
余談
● この件に関して、Brendan EichとDouglas Crockfordの意
見は当初の段階で分かれてるっぽい
○ Brendan Eich: JavaScript作った人。偉い
○ Douglas Crockford: JSON...
余談
● Eich「前方互換性を壊すので慎重にすべき」
● Crockford「古いコードが壊れてでもやるべき」
そのうち解決されますように...
3つ目
array & generator
comprehensions
array & generator comprehensions
● array comprehension
○ [for (i of [1, 2, 3]) i * i] // => [1, 4, 9]
● generator comprehe...
実は
● ECMAScript勉強会でやりました
○ http://kmc.hatenablog.jp/entry/2014/07/26/181228
● 2014/7/26日時点(Rev26)では仕様に含まれていた
○ Firefoxでは実装...
悲劇は突然
つらい・・・
何があったのか
● https://esdiscuss.org/notes/2014-07-30#4-7-revisit-
comprehension-decision-from-last-meeting-
● このミーティングでDave He...
no comprehensions style
https://github.com/dherman/sudoku/blob/master/solver.methods.js
LINQ style
https://github.com/dherman/sudoku/blob/master/solver.linq.js
pythonic style
https://github.com/dherman/sudoku/blob/master/solver.pythonic.js
どれがよい?
no comprehensions style
● iteratorにmapやfilter等の便利メソッドを追加した形
● 今まで通りのJavaScriptって感じで読める
LINQ style
● generator comprehensionを使ってLINQを意識した形
● comprehensionとメソッドチェインが混ざっている
pythonic style
● array comprehensionを使ってpythonを意識した形
● comprehensionとメソッドチェインが混ざっている
流れ変わったな
● これを見る前は支持していた人も多かったようだが...
○ 既に仕様に入ってたし
● 見たあとは
○ comprehensions使わなくても書けるじゃん
○ むしろ使いたくない
流れ変わったな
comprehensions、敗北
いや、まだ死んでない
● 結局、ECMAScript7まで延期とのこと
● 今後の状況では復活する可能性も
○ が、現状ではほぼ死にかけな気がする
内包表記君、どこ行ってしもうたんや
● 突然の消失に惜しむ声が多数
○ https://esdiscuss.org/topic/comprehensions-where-art-thou
内包表記君、どこ行ってしもうたんや
● ミーティングに参加していなかった人から不満が出てくる
内包表記君、どこ行ってしもうたんや
「あんなコードはPythonicじゃないし、comprehensionが80文
字を超えてる時点でなんか変でしょ」
内包表記君、どこ行ってしもうたんや
Brendan Eich「求められていたのはArrayを(iterableや即時と
遅延等に分けて)一般化することだった。それにデリミタ(区切り
文字)が足りてないのに、わざわざ消費する必要はないよね」
comprehension
またお会いしましょう
4つ目
Private Symbols
Symbol
● SymbolオブジェクトがECMAScript6から導入された
● RubyのSymbolとスコシニテル
● 用途としては、文字列以外の特殊なプロパティとして使われ
ることが想定されていそう
○ obj[Symbol.toSt...
Symbol
● オブジェクトのプロパティのうち、キーがSymbolになってい
るものを取り出すことができる
var obj = {};
var sym = Symbol();
obj[sym] = 1;
Object.getOwnProper...
Private Symbol
● https://esdiscuss.org/topic/proposal-about-private-
symbol
● 「getOwnPropertySymbolsで取り出せないPrivate Symbol
...
Private Symbol
Private Symbolがあれば
var obj = function() {
var privateSym = Symbol(‘hoge’, true);
this[privateSym] = ‘秘密のデータ...
と、思いきや
Private Symbol
Private Symbolがあれば
var obj = function() {
var privateSym = Symbol(‘hoge’, true);
this[privateSym] = ‘秘密のデータ...
コード書きなおし
Private Symbol
Symbolを外から参照できないようにするためだけなのに、長い!!
簡単に安全なコードを
かけないようじゃダメ
余談
● Private Symbolに関しては、過去にもっと条件をつけて提
案した人がいたが、WeakMapとProxyの関係上失敗したら
しい
○ https://github.com/zenparsing/es-abstract-
ref...
社会は厳しい
5つ目
いつの間にかなくなってたけど
理由がはっきり分からないやつ
いつの間にかなくなってたけど
理由がはっきり分からないやつ
時間が足りませんでした!(土下座
Object Literal Extensions
● http://wiki.ecmascript.org/doku.php?id=harmony:
object_literals
● Objectの文法拡張提案
○ Set Literal ...
Object Literal Extensions
● http://wiki.ecmascript.org/doku.php?id=harmony:
object_literals
● Objectの文法拡張提案
○ Set Literal ...
Set Literal [[Prototype]] Operator
Set Literal [[Prototype]] Operator
● http://wiki.ecmascript.org/doku.php?id=harmony:
proto_operator
● MemberExpression <| ...
基本的な機能
右の値(RHS)の[[Prototype]]に左のオブジェクト(LHS)を代入し
て返す
(LHSを継承したRHSを返すみたいなイメージ)
var obj = {c: 3};
var newObj = obj <| {a: 1, ...
ただし、右が関数式の場合は
RHSにくるもので挙動が異なる!
なんとなく
死んだ理由がわかった気がする...
(そもそも <| って気持ち悪い)
要調査
● class(ECMAScript6から追加された)のextendsとして生ま
れ変わったのかも?
○ https://esdiscuss.org/topic/alternative-syntax-for
class Parent {...
Object Literal Property Shorthands
Object Literal Property Shorthands
var old = {
bar: 1,
foo: function() { return 1 }
};
var new = {
bar := 1,
foo() { retur...
Object Literal Property Shorthands
var old = {
bar: 1,
foo: function() { return 1 }
};
var new = {
bar := 1, → 死亡
foo() { ...
なんでそうなったかは不明
Object Initialiser super References
Object Initialiser super References
● http://wiki.ecmascript.org/doku.php?id=harmony:
object_initialiser_super
● super key...
Object Initialiser super References
生き残った例
class Parent {
foo() { … }
}
class Child extend Parent {
foo() { super(); }
}
Object Initialiser super References
生き残った例2
class Parent {
foo() { … }
}
class Child extend Parent {
bar() { super.foo(); ...
Object Initialiser super References
死んだ例(当初はclassはなかったので、classがあったと想定)
class Child extend Parent {
get super set f(v) { f ...
Object Initialiser super References
class Child extend Parent {
get super set f(v) { f = v; }
}
上と下は同じ
class Child extend ...
get super set…うーん...
(set super getもある)
Object Extension Literal
Object Extension Literal
.を使ってオブジェクトを拡張できるリテラル
var obj = {};
obj.{ a: 1, b: 2, c: 3 };
obj.a // => 1
過激だ!
Object Extension Literal
● そこそこ物議を醸した
○ https://esdiscuss.org/topic/new-object-extension-literal-strawman
● さらに、これを使ったclas...
Object Extension Literal
過激だ!!
ところで、生き残った構文は?
Object Literal Property Value
Shorthand
Object Literal Property Value Shorthand
オブジェクトの初期化時に、変数名とプロパティ名が同じ場合に
使える省略記法
var a = 1, b = 2;
var old = { a: a, b: b };
...
Object Literal Computed
Property Keys
Object Literal Computed Property Keys
オブジェクトの初期化時に、プロパティ名に式の評価結果を与
えることができる
var a = ‘key’;
var old = {}; old[a] = 1;
var n...
個人的にはあまり使いたくない
終わりに
まとめ
● Proposalにもいろいろある
○ こんなん考えたんだけどどう?程度のものから
○ Abstruct Syntax Tree入りの仕様を持ってくるものまで
● コミュニティの皆様方、お疲れ様です...
○ 特に前者のProposa...
死んでいったProposalに黙祷
ECMAScript没proposal追悼式
ECMAScript没proposal追悼式
Upcoming SlideShare
Loading in …5
×

ECMAScript没proposal追悼式

14,989 views

Published on

ECMAScript没proposal追悼式

Published in: Technology
  • Be the first to comment

ECMAScript没proposal追悼式

  1. 1. ECMAScript 没Proposal追悼式 tyage@KMC
  2. 2. 本日はお集まりいただき ありがとうございます
  3. 3. 司会担当
  4. 4. ● id: tyage ● 京大工学部情報学科3回 ● JavaScriptとか書いてる ● 趣味 ○ 脆弱性報告 ○ CTF 司会担当
  5. 5. ECMAScriptとは ● JavaScriptやActionScriptの実装基盤となっている言語 ● Ecma Internationalによって標準化される ● (例会講座でも一度紹介しました)
  6. 6. ECMAScript標準化の流れ ● Strawman(仕様提案) ● →Proposal(具体化・デモ・試案) ● →Draft(仕様書作成) ○ イマココ ○ 3/4にRC2が出来た ● →Candidate(実装・フィードバック) ● →完成
  7. 7. ECMAScript Proposalとは ● 様々な人から仕様に入れてほしい提案(Proposal)が送られ てくる ○ 提案を検討して、仕様に組み込んだり却下したり ○ Proposalフェーズでなくても送られてくる
  8. 8. 採用されたECMAScript Proposal ● ECMAScript6勉強会でやりました ○ class ○ generator ○ Symbol ○ Map ○ const ○ Promise ○ Proxy ○ etc...
  9. 9. 今日話すこと ● Proposalだったが、ECMAScript6の仕様書(RC2)に入らな かったもの(死者)を一部紹介 ○ ※覚えてもメリットはないかも ● 英語の誤訳が多数含まれているかと思いますがご了承下さ い
  10. 10. 1つ目
  11. 11. "use" keyword
  12. 12. "use" keyword ● https://esdiscuss.org/topic/proposal-use-keyword ○ 生年月日: 2014年7月25日 ○ 没年月日: 2014年7月26日 ● 「なんでPHPの”use”みたいな物が無いんや」
  13. 13. なんだそれは???
  14. 14. "use" keyword ● PHP5.3くらいから追加されてたkeyword ● 無名関数を宣言する際に、親のスコープから変数を引き継 ぐことができる ○ こんな機能使ったことないし知らなかったゾ...
  15. 15. "use" keyword > // 通常、無名関数は外のスコープの変数を参照できない > $message = ‘hoge’; > $fun = function() { echo $message; }; > $fun(); PHP Notice: Undefined variable: message in php shell code on line 1
  16. 16. "use" keyword > // use keywordを使うと外のスコープの変数が参照できる > $message = ‘hoge’; > $fun = function() use ($message) { echo $message; }; > $fun(); hoge
  17. 17. なるほど
  18. 18. 一方ECMAScriptでは // 暗黙的に外のスコープの変数を見に行く var message = 'hoge'; var fun = function() { console.log(message); }; fun(); hoge
  19. 19. あれ、”use” keyword要らなくね?
  20. 20. どうやらそうではないらしい 引数を使わず、関数から別スコープにあるローカル変数が参照 したいようだ (追記: dynamic scopeというらしい)
  21. 21. どうやらそうではないらしい function fun1() { var message = ‘hoge’; fun2.attachContext(); }; function fun2() { console.log(message); }; fun1のスコープにある messageを参照できる
  22. 22. えっ、何これは・・・(ドン引き
  23. 23. 皆様の反応 ● PHP関係ないやんけ ● 何がしたいのかわからん
  24. 24. 皆様の反応 ● デメリットのほうが圧倒的に大きいのでは ○ 人間もコンピュータも解析しづらい ● どう考えてもダメ
  25. 25. ご愁傷さまです
  26. 26. 2つ目
  27. 27. typeof null
  28. 28. typeof null ● http://wiki.ecmascript.org/doku.php?id=harmony: typeof_null ● typeof null が “null” を返すようにしてほしいという提案
  29. 29. typeof演算子 ● オブジェクトやプリミティブ値のデータ型を文字で返す typeof 37 === “number” typeof “hoge” === “string” typeof {a: 1} === “object” typeof undefined === “undefined”
  30. 30. typeof null === ??? ではこれは何になるでしょうか typeof null
  31. 31. typeof null === ??? ではこれは何になるでしょうか typeof null === “object” ※nullはプリミティブ値です
  32. 32. どうしてこうなった
  33. 33. 歴史的経緯 初期のJavaScriptの実装では各値の32bit領域中に以下の type tagデータが入っていた http://www.2ality.com/2013/10/typeof-null.html ● 000: object ● 1: int ● 010: double ● 100: string ● 110: boolean
  34. 34. 歴史的経緯 typeof演算子はtype tagでチェックしていた if (JSVAL_IS_VOID(v)) { type = JSTYPE_VOID; } else if (JSVAL_IS_OBJECT(v)) { … type = JSTYPE_OBJECT
  35. 35. 歴史的経緯 nullはnull pointer(0x00)で表されていたので、type tagが objectと同じになる!! → typeof null === “object”
  36. 36. 歴史的経緯 Brendan Eichが納期に追われて作ってしまったらしい...
  37. 37. 糞言語かよ!!
  38. 38. typeof null ● 10年くらい前からtypeof nullが”null”を返すように変更する かは議論されていた ○ http://wiki.ecmascript.org/doku.php?id=discussion:typeof
  39. 39. typeof null ● 当然ECMAScript6で修正しようという風潮はあったが... ○ V8では実装されていたらしい
  40. 40. typeof null ● typeof nullが”object”を返すことに依存したコードが多く存 在した ○ このまま仕様を変えると古いWebページが見れなくなるかも ○ 古いコードの解釈が変わらないようにしないといけない ■ 前方互換性
  41. 41. typeof null ● typeof nullが”object”を返すことに依存したコードが多く存 在した ○ このまま仕様を変えると古いWebページが見れなくなるかも ○ 古いコードの解釈が変わらないようにしないといけない ■ 前方互換性
  42. 42. 手遅れ
  43. 43. 余談 ● この件に関して、Brendan EichとDouglas Crockfordの意 見は当初の段階で分かれてるっぽい ○ Brendan Eich: JavaScript作った人。偉い ○ Douglas Crockford: JSONとか作った人。偉い
  44. 44. 余談 ● Eich「前方互換性を壊すので慎重にすべき」 ● Crockford「古いコードが壊れてでもやるべき」
  45. 45. そのうち解決されますように...
  46. 46. 3つ目
  47. 47. array & generator comprehensions
  48. 48. array & generator comprehensions ● array comprehension ○ [for (i of [1, 2, 3]) i * i] // => [1, 4, 9] ● generator comprehension ○ (for (i of [1, 2, 3]) i * i) // => 1, 4, 9を順に返すgenerator あっ、これPythonで見たことあるやつだ! (Pythonだとリスト内包表記って呼ばれてるよね)
  49. 49. 実は ● ECMAScript勉強会でやりました ○ http://kmc.hatenablog.jp/entry/2014/07/26/181228 ● 2014/7/26日時点(Rev26)では仕様に含まれていた ○ Firefoxでは実装されてて動く ● 個人的には便利そうだしかなり気に入ってた
  50. 50. 悲劇は突然
  51. 51. つらい・・・
  52. 52. 何があったのか ● https://esdiscuss.org/notes/2014-07-30#4-7-revisit- comprehension-decision-from-last-meeting- ● このミーティングでDave Hermanがcomprehensionの問 題点を指摘 ○ JavaScriptで書いた3種類の数独ソルバーを提示 ■ no comprehension style ■ LINQ style ■ pythonic style
  53. 53. no comprehensions style https://github.com/dherman/sudoku/blob/master/solver.methods.js
  54. 54. LINQ style https://github.com/dherman/sudoku/blob/master/solver.linq.js
  55. 55. pythonic style https://github.com/dherman/sudoku/blob/master/solver.pythonic.js
  56. 56. どれがよい?
  57. 57. no comprehensions style ● iteratorにmapやfilter等の便利メソッドを追加した形 ● 今まで通りのJavaScriptって感じで読める
  58. 58. LINQ style ● generator comprehensionを使ってLINQを意識した形 ● comprehensionとメソッドチェインが混ざっている
  59. 59. pythonic style ● array comprehensionを使ってpythonを意識した形 ● comprehensionとメソッドチェインが混ざっている
  60. 60. 流れ変わったな ● これを見る前は支持していた人も多かったようだが... ○ 既に仕様に入ってたし ● 見たあとは ○ comprehensions使わなくても書けるじゃん ○ むしろ使いたくない
  61. 61. 流れ変わったな
  62. 62. comprehensions、敗北
  63. 63. いや、まだ死んでない ● 結局、ECMAScript7まで延期とのこと ● 今後の状況では復活する可能性も ○ が、現状ではほぼ死にかけな気がする
  64. 64. 内包表記君、どこ行ってしもうたんや ● 突然の消失に惜しむ声が多数 ○ https://esdiscuss.org/topic/comprehensions-where-art-thou
  65. 65. 内包表記君、どこ行ってしもうたんや ● ミーティングに参加していなかった人から不満が出てくる
  66. 66. 内包表記君、どこ行ってしもうたんや 「あんなコードはPythonicじゃないし、comprehensionが80文 字を超えてる時点でなんか変でしょ」
  67. 67. 内包表記君、どこ行ってしもうたんや Brendan Eich「求められていたのはArrayを(iterableや即時と 遅延等に分けて)一般化することだった。それにデリミタ(区切り 文字)が足りてないのに、わざわざ消費する必要はないよね」
  68. 68. comprehension またお会いしましょう
  69. 69. 4つ目
  70. 70. Private Symbols
  71. 71. Symbol ● SymbolオブジェクトがECMAScript6から導入された ● RubyのSymbolとスコシニテル ● 用途としては、文字列以外の特殊なプロパティとして使われ ることが想定されていそう ○ obj[Symbol.toStringTag] = ‘tag’ ● ユニークなSymbolを生み出すことができる ○ Symbol('foo') !== Symbol('foo')
  72. 72. Symbol ● オブジェクトのプロパティのうち、キーがSymbolになってい るものを取り出すことができる var obj = {}; var sym = Symbol(); obj[sym] = 1; Object.getOwnPropertySymbols(obj)[0] === sym;
  73. 73. Private Symbol ● https://esdiscuss.org/topic/proposal-about-private- symbol ● 「getOwnPropertySymbolsで取り出せないPrivate Symbol が欲しい」 ● 提案したのは中国の高校生
  74. 74. Private Symbol Private Symbolがあれば var obj = function() { var privateSym = Symbol(‘hoge’, true); this[privateSym] = ‘秘密のデータ’ }; privateSymが分からないのでobjから秘密のデータが見えない
  75. 75. と、思いきや
  76. 76. Private Symbol Private Symbolがあれば var obj = function() { var privateSym = Symbol(‘hoge’, true); this[privateSym] = ‘秘密のデータ’ }; var x = {}; obj.call(x); // => xにproxyを設定しておけばprivateSymがわかる
  77. 77. コード書きなおし
  78. 78. Private Symbol Symbolを外から参照できないようにするためだけなのに、長い!!
  79. 79. 簡単に安全なコードを かけないようじゃダメ
  80. 80. 余談 ● Private Symbolに関しては、過去にもっと条件をつけて提 案した人がいたが、WeakMapとProxyの関係上失敗したら しい ○ https://github.com/zenparsing/es-abstract- refs/issues/11#issuecomment-65723350
  81. 81. 社会は厳しい
  82. 82. 5つ目
  83. 83. いつの間にかなくなってたけど 理由がはっきり分からないやつ
  84. 84. いつの間にかなくなってたけど 理由がはっきり分からないやつ 時間が足りませんでした!(土下座
  85. 85. Object Literal Extensions ● http://wiki.ecmascript.org/doku.php?id=harmony: object_literals ● Objectの文法拡張提案 ○ Set Literal [[Prototype]] Operator ○ Object Literal Property Shorthands ○ Object Literal Property Value Shorthand ○ Object Literal Computed Property Keys ○ Object Initialiser super References ○ Object Extension Literal
  86. 86. Object Literal Extensions ● http://wiki.ecmascript.org/doku.php?id=harmony: object_literals ● Objectの文法拡張提案 ○ Set Literal [[Prototype]] Operator → 死亡 ○ Object Literal Property Shorthands → 一部死亡 ○ Object Literal Property Value Shorthand → 生存 ○ Object Literal Computed Property Keys → 生存 ○ Object Initialiser super References → 一部死亡 ○ Object Extension Literal → 死亡
  87. 87. Set Literal [[Prototype]] Operator
  88. 88. Set Literal [[Prototype]] Operator ● http://wiki.ecmascript.org/doku.php?id=harmony: proto_operator ● MemberExpression <| ProtoLiteral ○ という構文
  89. 89. 基本的な機能 右の値(RHS)の[[Prototype]]に左のオブジェクト(LHS)を代入し て返す (LHSを継承したRHSを返すみたいなイメージ) var obj = {c: 3}; var newObj = obj <| {a: 1, b: 2}; newObj.c // => 3
  90. 90. ただし、右が関数式の場合は
  91. 91. RHSにくるもので挙動が異なる!
  92. 92. なんとなく 死んだ理由がわかった気がする... (そもそも <| って気持ち悪い)
  93. 93. 要調査 ● class(ECMAScript6から追加された)のextendsとして生ま れ変わったのかも? ○ https://esdiscuss.org/topic/alternative-syntax-for class Parent { … } class Child extends Parent { … } class Child2 extends (function() {}) { … }
  94. 94. Object Literal Property Shorthands
  95. 95. Object Literal Property Shorthands var old = { bar: 1, foo: function() { return 1 } }; var new = { bar := 1, foo() { return 1 } }; // ※newオブジェクトのpropertyは全てnon-writable
  96. 96. Object Literal Property Shorthands var old = { bar: 1, foo: function() { return 1 } }; var new = { bar := 1, → 死亡 foo() { return 1 } → 生存 }; // ※newオブジェクトのpropertyは全てnon-writable
  97. 97. なんでそうなったかは不明
  98. 98. Object Initialiser super References
  99. 99. Object Initialiser super References ● http://wiki.ecmascript.org/doku.php?id=harmony: object_initialiser_super ● super keywordを使って継承元のclassのメソッドが呼び出 せる ○ Pythonで見たことあるkeywordだな...
  100. 100. Object Initialiser super References 生き残った例 class Parent { foo() { … } } class Child extend Parent { foo() { super(); } }
  101. 101. Object Initialiser super References 生き残った例2 class Parent { foo() { … } } class Child extend Parent { bar() { super.foo(); } }
  102. 102. Object Initialiser super References 死んだ例(当初はclassはなかったので、classがあったと想定) class Child extend Parent { get super set f(v) { f = v; } }
  103. 103. Object Initialiser super References class Child extend Parent { get super set f(v) { f = v; } } 上と下は同じ class Child extend Parent { set f(v) { f=v; } get f() { return super.f; } }
  104. 104. get super set…うーん... (set super getもある)
  105. 105. Object Extension Literal
  106. 106. Object Extension Literal .を使ってオブジェクトを拡張できるリテラル var obj = {}; obj.{ a: 1, b: 2, c: 3 }; obj.a // => 1
  107. 107. 過激だ!
  108. 108. Object Extension Literal ● そこそこ物議を醸した ○ https://esdiscuss.org/topic/new-object-extension-literal-strawman ● さらに、これを使ったclass定義を考える人も ○ http://wiki.ecmascript.org/doku.php?id=harmony: object_extension_literal_class_pattern
  109. 109. Object Extension Literal
  110. 110. 過激だ!!
  111. 111. ところで、生き残った構文は?
  112. 112. Object Literal Property Value Shorthand
  113. 113. Object Literal Property Value Shorthand オブジェクトの初期化時に、変数名とプロパティ名が同じ場合に 使える省略記法 var a = 1, b = 2; var old = { a: a, b: b }; var new = { a, b };
  114. 114. Object Literal Computed Property Keys
  115. 115. Object Literal Computed Property Keys オブジェクトの初期化時に、プロパティ名に式の評価結果を与 えることができる var a = ‘key’; var old = {}; old[a] = 1; var new = { [a]: 1 };
  116. 116. 個人的にはあまり使いたくない
  117. 117. 終わりに
  118. 118. まとめ ● Proposalにもいろいろある ○ こんなん考えたんだけどどう?程度のものから ○ Abstruct Syntax Tree入りの仕様を持ってくるものまで ● コミュニティの皆様方、お疲れ様です... ○ 特に前者のProposalは意図を把握するのが大変そう ○ ミーティングが思ったより戦いっぽくて大変そう
  119. 119. 死んでいったProposalに黙祷

×