他言語遣いの人にJSのカプセル化と継承を説明したい
prototypeプロパティを使わないで何とかできないかなぁと今日考えていて、結局The Good Partsの形にしかならなかった。けどまあログを残しておきます…… newしないんだからコンストラクタ名はcapitalizeするなとThe Good Partsには書いてありますが、やっぱり使い勝手わるいよなぁとか。あと、クロージャは避けるべき的な話はあちこちで言われていますが、やっぱり使わないとしんどいなぁとか……
<?xml version="1.0" encoding="utf-8"?> <job> <script language="JScript"><![CDATA[ (function() { var Sup = function(spec, my) { var _name = spec.name; my = my || {}; my.val = 0; var that = {}; that.get_name = function() { return _name; }; that.get_val = function() { return my.val; }; that.plus_val = function() { my.val = my.val + 1; return that; }; return that; }; var Sub = function(spec, my) { my = my || {}; var that = Sup(spec, my); // Sub extends Sup // @Override that.plus_val = function() { my.val = my.val + 2; return that; }; that.minus_val = function() { my.val = my.val - 1; return that; }; return that; }; var sup = Sup({name:'sup'}); var sub = Sub({name:'sub'}); WSH.echo([ sup.get_name(), sup.plus_val().get_val() ].join(':')); // sup:1 WSH.echo([ sup.get_name(), sup.plus_val().get_val() ].join(':')); // sup:2 WSH.echo(typeof sup.minus_val); // undefined WSH.echo([ sub.get_name(), sub.plus_val().get_val() ].join(':')); // sub:2 WSH.echo([ sub.get_name(), sub.plus_val().get_val() ].join(':')); // sub:4 WSH.echo([ sub.get_name(), sub.minus_val().get_val() ].join(':')); // sub:3 })(); ]]></script> </job>