Created
April 6, 2016 12:58
-
-
Save Zorgatone/56b594bf315a53aee417d842b7e0c3cb to your computer and use it in GitHub Desktop.
Inheritable Top-level Classes
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"use strict"; | |
Object.defineProperty(window, "BaseObject", { | |
value: (() => { | |
let nil = Object.freeze(Object.create(null)); | |
Object.defineProperty(window, "Nil", { | |
value: (() => { | |
function Nil() {} | |
Nil.prototype = nil; | |
return Nil; | |
})(), | |
writable: false, | |
enumerable: false, | |
configurable: false | |
}); | |
// (nil !== nil) => true | |
// (nil instanceof Nil) => true | |
// (nil.prop = "val"; nil.prop) => undefined | |
Object.defineProperty(window, "nil", { | |
get: function () { | |
return Object.freeze(new Nil()); | |
}, | |
set: function () { | |
throw new Error("Cannot overwrite nil"); | |
}, | |
enumerable: false, | |
configurable: false | |
}); | |
class BaseObject extends Nil { | |
constructor() { | |
super(); | |
// non-enumerable [fixes JSON.stringify bug] | |
Object.defineProperty(this, "__proto__", { | |
value: BaseObject.prototype, | |
writable: false, | |
enumerable: false, | |
configurable: false | |
}); | |
} | |
toString() { | |
return `[object ${this.constructor.name}]`; | |
} | |
toJson() { | |
return JSON.stringify(Object.assign({ | |
"__class__": this.constructor.name | |
}, this)); | |
} | |
} | |
BaseObject.fromJson = obj => { | |
return Object.assign(new BaseObject(), JSON.parse(obj)); | |
}; | |
return BaseObject; | |
})(), | |
writable: false, | |
enumerable: false, | |
configurable: false | |
}); | |
class Entity extends BaseObject { | |
constructor(name = "Steve") { | |
super(); | |
this.name = name; | |
} | |
sayHi() { | |
console.log(`Hi! My name is ${this.name}`); | |
} | |
} | |
// Entity.fromJson = undefined; | |
Entity.fromJson = obj => { | |
let parsed = JSON.parse(obj); | |
delete parsed["__class__"]; | |
return Object.assign(new Entity(parsed && parsed.name), parsed); | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment