KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
I'm coming to Javascript from a background in Python and Smalltalk, and I appreciate the linage of Self and Lisp in the language. With ECMAScript5, I wanted to try my hand at prototypal OO without the new operator. Constraints: optional new operator to create classes prototype chain must be correct for instanceof named constructors for WebInspector debugging support alloc().init() creation sequence like Objective-C and Python Here is my attempt at the implementation to meet the criteria: function subclass(Class, Base) { "use strict"; function create(self, args) { if (!(self instanceof this)) self = Object.create(this.prototype); var init = self.__init__; return init ? init.apply(self, args) : self; } if (Base instanceof Function) Base = Base.prototype; else if (Base===undefined) Base = Object.prototype; Class.prototype = Object.create(Base); Class.prototype.constructor = Class; Class.create = create; Class.define = function define(name, fn) { return Class.prototype[name] = fn; }; Class.define('__name__', Class.name); return Class; } And it seems to work in a simple mockup: function Family(){return Family.create(this, arguments)} subclass(Family, Object); Family.define('__init__', function __init__(n){this.name=n; return this;}); function Tribe(){return Tribe.create(this, arguments)} subclass(Tribe, Family); function Genus(){return Genus.create(this, arguments)} subclass(Genus, Tribe); function Species(){return Species.create(this, arguments)} subclass(Species, Genus); Using the class as a factory function: var dog = Species('dog'); console.assert(dog instanceof Object); console.assert(dog instanceof Family); console.assert(dog instanceof Tribe); console.assert(dog instanceof Genus); console.assert(dog instanceof Species); </p
Tags (comma-separated)
Save Edits
Cancel