トップページ > プログラム > 2014年04月03日 > RYlKP7xj

書き込み順位&時間帯一覧

27 位/205 ID中時間01234567891011121314151617181920212223Total
書き込み数0000001000000000000020003



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
【PHP,JavaScript】スクリプト バトルロワイヤル43【pl,rb,py】

書き込みレス一覧

【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


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。