他言語遣いの人に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>