{"id":20743056,"url":"https://github.com/aimingoo/metameta","last_synced_at":"2025-04-24T05:16:31.453Z","repository":{"id":57095775,"uuid":"145089212","full_name":"aimingoo/metameta","owner":"aimingoo","description":"Metameta is meta core and meta-class programming framework.","archived":false,"fork":false,"pushed_at":"2020-05-18T10:11:09.000Z","size":11,"stargazers_count":40,"open_issues_count":0,"forks_count":1,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-03-30T07:11:46.837Z","etag":null,"topics":["es6","language-design","meta","metaprogramming","oop-concepts"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/aimingoo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-08-17T07:46:17.000Z","updated_at":"2022-05-29T08:13:25.000Z","dependencies_parsed_at":"2022-08-22T21:40:31.961Z","dependency_job_id":null,"html_url":"https://github.com/aimingoo/metameta","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aimingoo%2Fmetameta","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aimingoo%2Fmetameta/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aimingoo%2Fmetameta/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aimingoo%2Fmetameta/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aimingoo","download_url":"https://codeload.github.com/aimingoo/metameta/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250561849,"owners_count":21450499,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["es6","language-design","meta","metaprogramming","oop-concepts"],"created_at":"2024-11-17T07:08:54.688Z","updated_at":"2025-04-24T05:16:31.336Z","avatar_url":"https://github.com/aimingoo.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Metameta\n\nMetameta is meta core and meta-class programming framework.\n\n\n- [Usage](#usage)\n- [The Meta](#the-meta)\n  * [atom](#atom)\n  * [meta/Atom](#metaatom)\n  * [Meta](#meta)\n  * [MetaClass](#metaclass)\n  * [MetaObject](#metaobject)\n- [Shadow meta](#shadow-meta)\n- [More testcases](#more-testcases)\n- [Interface](#interface)\n- [History](#history)\n\n\n\n## Usage\n\n```bash\n# install from npm\n\u003e npm install @aimingoo/metameta\n\n# OR, install from github\n\u003e npm install aimingoo/metameta\n```\n\nAnd use in javascript\n\n```javascript\n// Meta core\nvar {Meta, MetaClass, MetaObject} = require('@aimingoo/metameta');\n\n// Helper methods, all home object safed.\nvar {isMeta, isAtom, asAtom} = Meta;\n\n// learn case\nvar Objext = Meta.from(Object);\nconsole.log(Objext.keys(new Objext)); // []\nconsole.log(Meta.isAtom(new Objext)); // true\n```\n\n\n\n## The Meta\n\n### atom\n\nThe **atom** is smallest unit of pure object in javascript, it's object but not inherited from Object(). An atom is a object. `null`, `Object.prototype`, ~~`arguments`~~ and `namespace` are atom objects in javascript language.\n\n```bash\n\u003e Meta.isAtom(null);\ntrue\n\n\u003e Meta.isAtom(Object.prototype)\ntrue\n```\n\n\n\n### meta/Atom\n\natom created by meta, so the **meta** is constructor of atoms, with **Atom()** on the concept is the same. meta is base unit of Meta system, and is function always.\n\n```bash\n# meta is same of Atom()\n\u003e meta = new Meta; \n\n# atom created\n\u003e atom = new meta;\n\n# check is atom\n\u003e Meta.isAtom(atom);\ntrue\n\n# check is object\n\u003e typeof atom;\n'object'\n```\n\n\n\n### Meta\n\nMeta is meta's class.\n\n```javascript\n// extend\nclass MetaX extends Meta {};\nvar meta = new MetaX;\n\n// meta is atom too.\nconsole.log(Meta.isAtom(new Meta)); // true\nconsole.log(Meta.isAtom(meta)); // true\n\n// instance from meta, check inheritance\nvar x = new meta;\nconsole.log(x instanceof meta); // true\nconsole.log(x instanceof Meta); // true\nconsole.log(x instanceof MetaX); // true\n// another\nclass MetaX2 extends Meta {};\nconsole.log(x instanceof MetaX2); // false\n```\n\n\n\n### MetaClass\n\nMetaClass is root of Meta-classes programming system.\n\n```javascript\n// meta-classes\nclass MetaClassEx extends MetaClass {\n    // ...\n}\n\n// extend meta system\n//  NOTE: must extends from a meta/Atom\nclass AtomObjects extends new MetaClassEx() {\n    // ...\n}\n\n// check\nconsole.log(MetaClass.isClassOf(MetaClassEx)); // true\nconsole.log(MetaClassEx.isClassOf(AtomObjects)); // true\nconsole.log(MetaClassEx.isClassOf(new AtomObjects)); // true\n// another\nconsole.log(MetaClassEx.isClassOf(new MetaObject)); // false\n```\n\n\n\n### MetaObject\n\nMetaObject is a meta of MetaClass, and is a Class/Atom-constructor of atoms.\n\n```javascript\n// MetaObject is defined in metameta\nvar obj = new MetaObject;\nconsole.log(Meta.isAtom(obj)); // true\n\n// extend object system\nclass MetaObjectEx extends MetaObject{}\n\n// create atom\nvar x = new MetaObjectEx;\n\n// check\nconsole.log(MetaClass.isClassOf(MetaObject)); // true\nconsole.log(MetaClass.isClassOf(MetaObjectEx)); // true\nconsole.log(MetaClass.isClassOf(x)); // true\n\n// check in pure javascript\nconsole.log(x instanceof MetaObject); // true\nconsole.log(x instanceof MetaObjectEx); // true\nconsole.log(x instanceof MetaObject); // true\nconsole.log(x instanceof MetaClass); // true\nconsole.log(x instanceof Meta); // true\n\n// more\nvar isPrototypeOf = (...args) =\u003e Object.prototype.isPrototypeOf.call(...args);\nconsole.log(isPrototypeOf(MetaObject, MetaObjectEx)); // true\nconsole.log(isPrototypeOf(MetaClass, MetaObject)); // false\nconsole.log(isPrototypeOf(MetaClass, MetaObjectEx)); // false\n```\n\n\n\n## Shadow meta\n\nA shadow is meta from native constructor.\n\n```javascript\n// shadow from native-constructor\nvar Objext = Meta.from(Object);\n\n// shadow is meta\nvar x = new Objext;\nconsole.log(Meta.isAtom(x)); // true\n\n// shadow has static methods from source\nconsole.log(Objext.keys(x)); // []\n```\n\n\n\n## More testcases\n\n```bash\n# pull source\n\u003e git clone https://github.com/aimingoo/metameta\n\u003e cd metameta\n\u003e npm install\n\n# test\n\u003e npm test\n\n# coverage\n\u003e npm -g install istanbul\n\u003e npm run coverage\n```\n\n\n\n## Interface\n\n* Meta's Class methods\n\n    ```javascript\n    // Return a object is atom object\n    // @param {object|function} - a object\n    Meta.isAtom(x)\n\n    // Return a new atom/Atom, it's proxy of x, and prototype by base.\n    // @param {object}[object] - a atom base another atom object\n    // @param {function}[function=Atom] - a meta base meta/Meta/Atom...\n    Meta.asAtom(x, base)\n\n    // Return a class is Meta\n    // @param {function} - a class\n    Meta.isMeta(cls)\n\n    // Return a shadow meta for native-constructor\n    // @param {function} - a native constructor\n    Meta.from(constructor)\n    ```\n\n* MetaClass's Class methods\n\n    ```javascript\n    // Return the class is base of x\n    // @param {object} - is instance of class\n    // @param {function} - is sub-class of class\n    MetaClass.isClassOf(x)\n    ```\n\n* extends from Meta\n\n    ```javascript\n    class MetaX extends Meta {}\n    ```\n\n* meta's extends\n\n    ```javascript\n    // Meta-classes programming framework based\n    class X extends new MetaClass {}\n\n    // OR\n    class X extends new MetaX{}\n    ```\n\n\n\n## History\n\n```\n2018.08.17 - v0.9.1 released, happy Chinese traditional valentine's day.\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faimingoo%2Fmetameta","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faimingoo%2Fmetameta","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faimingoo%2Fmetameta/lists"}