classical inheritance in javascript

Douglas Crockford用javascript模拟实现java的类继承。

Function.prototype.method = function(name, func) {    this.prototype[name] = func;    return this;};Function.method('inherits', function(parent) {    var d = {}, p = (this.prototype = new parent());    this.method('uber', function uber(name) {        if (!(name in d)) {            d[name] = 0;        }        var f, r, t = d[name],            v = parent.prototype;        if (t) {            while (t) {                v = v.constructor.prototype;                t -= 1;            }            f = v[name];        } else {            f = p[name];            if (f == this[name]) {                f = v[name];            }        }        d[name] += 1;        r = f.apply(this, Array.prototype.slice.apply(arguments, [1]));        d[name] -= 1;        return r;    });    return this;});Function.method('swiss', function(parent) {    for (var i = 1; i < arguments.length; i += 1) {        var name = arguments[i];        this.prototype[name] = parent.prototype[name];    }    return this;});
function Parenizor(value) {    this.setValue(value);}Parenizor.method('setValue', function(value) {    this.value = value;    return this;});Parenizor.method('getValue', function() {    return this.value;});Parenizor.method('toString', function() {    return '(' + this.getValue() + ')';});var myParenizor = new Parenizor(0);var myString = myParenizor.toString();console.log(myParenizor.value);console.log(myString);function ZParenizor(value) {    this.setValue(value);}ZParenizor.inherits(Parenizor);ZParenizor.method('toString', function() {    if (this.getValue()) {        return this.uber('toString');    }    return "-0-";});

There is another way to write ZParenizor. Instead of inheriting from Parenizor, we write a constructor that calls the Parenizor constructor, passing off the result as its own. And instead of adding public methods, the constructor adds privileged methods.

function ZParenizor2(value) {     var that = new Parenizor(value);     that.toString = function () {         if (this.getValue()) {             return this.uber('toString');         }         return "-0-"     };     return that;}var myZParenizor = new ZParenizor(0);var myString = myZParenizor.toString();console.log(myZParenizor.value);console.log(myString);