- 【PHP,JavaScript】スクリプト バトルロワイヤル43【pl,rb,py】
29 :デフォルトの名無しさん[sage]:2014/04/03(木) 06:01:52.05 ID:RYlKP7xj - Nodeで大変なのはモジュールや、コールバックパターンからES6のPromise+ジェネレータ→ES7のawaitパターンにどう持っていくかってことだと思う。
class構文は1つに統一するためのものではなく、新しい便利な書き方が1つ増えたと見るべき。valueプロパティなどクラス型では表現不能なこともある。 ES6ではプロトタイプ型の側面も強化されてるから、むしろ今まで以上に自由で色んな書き方ができるようになったと考えるべきだと思う。 色んな書き方でクラス型を簡潔に模倣することもできるし、クラス型以上に目的に適する柔軟なコーディングも可能なのはプロトタイプベースだからこそ。 let C = class extends B { //クラス型 プロトタイプ度20 static get VALUE() { return 0 } constructor(x) { this.x = x } method() { super() } } let c = new C(x) //模倣1.従来型(省略)プロトタイプ度40 let proto = { //模倣2.中間型(一例)プロトタイプ度60 VALUE: 0, prototype: {__proto__: B.prototype, constructor(x) { this.x = x }, method() { super() } } } let C = Object.assign(proto.prototype.constructor, proto) let c = new C(x) let C = { //模倣3.プロトタイプ型(一例)プロトタイプ度80 VALUE: 0, new(x) { return {__proto__: this.proto, x} }, proto: {__proto__: B.proto, method() { super() } } } let c = C.new(x)
| - 【PHP,JavaScript】スクリプト バトルロワイヤル43【pl,rb,py】
31 :デフォルトの名無しさん[]:2014/04/03(木) 20:03:30.60 ID:RYlKP7xj - classを使うのはいいけど、
例えばInt8Array.prototype.BYTES_PER_ELEMENTみたいのは再現できない。 class C {〜} C.prototype.BYTES_PER_ELEMENT = 〜 みたいにすることになる。 それとシンボルを把握しておいた方がいい。特にSymbol.createはそう。 class C { static [Symbol.create](){〜} static [Symbol.hasInstance](){〜} [Symbol.toPrimitive](){〜} } Object.assign(C.prototype, { [Symbol.toStringTag]: '〜' } その上で標準的な書き方として使うのなら全く問題ないが、自分でクラスシステムを作ってもいいと思う。
| - 【PHP,JavaScript】スクリプト バトルロワイヤル43【pl,rb,py】
33 :デフォルトの名無しさん[]:2014/04/03(木) 20:17:46.12 ID:RYlKP7xj - 納得のいくものを自分で作ればいい
function Class($, o) { if (!o) [$, o] = [Function, $] let f = function(...a){ this.class = f return f.new.apply(this, a) } let p = f.prototype f.__proto__ = $, p.__proto__ = $ && $.prototype || null Object.keys(o).forEach(k => { let v = o[k], t = k[0] == '$' ? p : f if (t == p) k = k.slice(1) t[k] = (typeof v=='function') ? v.toMethod(t, k) : v }) return f } const B = Class({ VALUE: 15, $method() { this.x *= this.class.VALUE } }) const C = Class(B, { new(x) { this.x = x }, $method() { super() } }) let c = new C(2) c.method() c.x //30
|
|