https://github.com/raineorshine/nativity
Safely add methods to native object prototypes
https://github.com/raineorshine/nativity
Last synced: 7 months ago
JSON representation
Safely add methods to native object prototypes
- Host: GitHub
- URL: https://github.com/raineorshine/nativity
- Owner: raineorshine
- Created: 2013-01-20T20:35:50.000Z (over 12 years ago)
- Default Branch: master
- Last Pushed: 2014-08-14T03:11:28.000Z (about 11 years ago)
- Last Synced: 2025-03-28T17:04:13.847Z (7 months ago)
- Language: CoffeeScript
- Homepage:
- Size: 263 KB
- Stars: 1
- Watchers: 3
- Forks: 1
- Open Issues: 5
-
Metadata Files:
- Readme: README.html
Awesome Lists containing this project
README
html { font-size: 100%; overflow-y: scroll; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; }
body{
color:#444;
font-family:Georgia, Palatino, 'Palatino Linotype', Times, 'Times New Roman',
"Hiragino Sans GB", "STXihei", "微软雅黑", serif;
font-size:12px;
line-height:1.5em;
background:#fefefe;
width: 45em;
margin: 10px auto;
padding: 1em;
outline: 1300px solid #FAFAFA;
}a{ color: #0645ad; text-decoration:none;}
a:visited{ color: #0b0080; }
a:hover{ color: #06e; }
a:active{ color:#faa700; }
a:focus{ outline: thin dotted; }
a:hover, a:active{ outline: 0; }span.backtick {
border:1px solid #EAEAEA;
border-radius:3px;
background:#F8F8F8;
padding:0 3px 0 3px;
}::-moz-selection{background:rgba(255,255,0,0.3);color:#000}
::selection{background:rgba(255,255,0,0.3);color:#000}a::-moz-selection{background:rgba(255,255,0,0.3);color:#0645ad}
a::selection{background:rgba(255,255,0,0.3);color:#0645ad}p{
margin:1em 0;
}img{
max-width:100%;
}h1,h2,h3,h4,h5,h6{
font-weight:normal;
color:#111;
line-height:1em;
}
h4,h5,h6{ font-weight: bold; }
h1{ font-size:2.5em; }
h2{ font-size:2em; border-bottom:1px solid silver; padding-bottom: 5px; }
h3{ font-size:1.5em; }
h4{ font-size:1.2em; }
h5{ font-size:1em; }
h6{ font-size:0.9em; }blockquote{
color:#666666;
margin:0;
padding-left: 3em;
border-left: 0.5em #EEE solid;
}
hr { display: block; height: 2px; border: 0; border-top: 1px solid #aaa;border-bottom: 1px solid #eee; margin: 1em 0; padding: 0; }pre , code, kbd, samp {
color: #000;
font-family: monospace;
font-size: 0.88em;
border-radius:3px;
background-color: #F8F8F8;
border: 1px solid #CCC;
}
pre { white-space: pre; white-space: pre-wrap; word-wrap: break-word; padding: 5px 12px;}
pre code { border: 0px !important; padding: 0;}
code { padding: 0 3px 0 3px; }b, strong { font-weight: bold; }
dfn { font-style: italic; }
ins { background: #ff9; color: #000; text-decoration: none; }
mark { background: #ff0; color: #000; font-style: italic; font-weight: bold; }
sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; }
sup { top: -0.5em; }
sub { bottom: -0.25em; }ul, ol { margin: 1em 0; padding: 0 0 0 2em; }
li p:last-child { margin:0 }
dd { margin: 0 0 0 2em; }img { border: 0; -ms-interpolation-mode: bicubic; vertical-align: middle; }
table { border-collapse: collapse; border-spacing: 0; }
td { vertical-align: top; }@media only screen and (min-width: 480px) {
body{font-size:14px;}
}@media only screen and (min-width: 768px) {
body{font-size:16px;}
}@media print {
* { background: transparent !important; color: black !important; filter:none !important; -ms-filter: none !important; }
body{font-size:12pt; max-width:100%; outline:none;}
a, a:visited { text-decoration: underline; }
hr { height: 1px; border:0; border-bottom:1px solid black; }
a[href]:after { content: " (" attr(href) ")"; }
abbr[title]:after { content: " (" attr(title) ")"; }
.ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { content: ""; }
pre, blockquote { border: 1px solid #999; padding-right: 1em; page-break-inside: avoid; }
tr, img { page-break-inside: avoid; }
img { max-width: 100% !important; }
@page :left { margin: 15mm 20mm 15mm 10mm; }
@page :right { margin: 15mm 10mm 15mm 20mm; }
p, h2, h3 { orphans: 3; widows: 3; }
h2, h3 { page-break-after: avoid; }
}
READMEnativity
Safely add methods to native object prototypes.
- Doesn't overwrite existing properties with same name by default for safety.
- If you do overwrite properties, you can access and restore them at any time.
- Automatically forwards "this" as first argument to installed functions. This is the magic that makes non-prototype functions work as prototype functions.
Install
$ npm install --save nativity
Usage
var nativity = require('nativity');
var _ = require('underscore');
nativity.install(Array.prototype, _, ['findWhere', 'pluck']);
var people = [
{ name: 'Tina', age: 45 },
{ name: 'Todd', age: 48 },
{ name: 'Tucker', age: 10 }
];
console.log(people.findWhere({ name: 'Todd' }));
// { name: 'Todd', age: 48 }
console.log(people.pluck('name'));
// ['Tina', Todd', 'Tucker']
You can install a single method:
nativity.installOne(String.prototype, _.template, 'format');
console.log('Hello <%= name %>!'.format({ name: 'Bartholomew' }));
// Hello Bartholomew!
API
nativity.install
Assigns the props from the source object to the destination object. Functions are converted to forward 'this' as the first argument.
nativity.install(destObject, srcObject[, props][, options]);
nativity.installOne
Assigns the value to the source object at the given key. If the value is a function it will be converted to forward 'this' as the first argument.
nativity.installOne(destObject, value, key[, options]);
Options
Defaults:
nativity.install(Array.prototype, _, ['findWhere', 'pluck'], {
// do not override existing properties on the host object
safe: true,
// only add properties that are functions
functionsOnly: false,
// specifies the argument index at which to forward 'this'
thisIndex: 0
});
Restoration
Nativity installs methods on objects safely, that is, you can access overwritten properties and restore them at any time.
var mylib = {
map: function(arr) { return 'blurp' },
filter: function(arr) { return 'skronk' },
dud: function() { return 'dud'; }
};
var installation = nativity.install(Array.prototype, mylib, { safe: false });
console.log([1,2,3].map(function(n) { return n*n; }));
// 'blurp'
console.log(installation.overwritten);
// 2
console.log(installation.new);
// { dud: [Function] }
console.log(installation.prev);
// { map: [Function], filter: [Function] }
installation.restore();
console.log([1,2,3].map(function(n) { return n*n; }));
// [1,4,9]
Notes
Technically, nativity is written such that it can add properties to any object (i.e. _.defaults). It is the automatic forwarding of "this" as the first argument to installed methods that makes it special.
_.pluck(people, 'name')
people.pluck('name')
Why is this better?
- Mimics Subject-Verb-Object structure of the English language
- More object-oriented
- Chainable
Unit Tests
Yes we have those
$ mocha
Build Notes
$ gulp --require coffee-script/register
Plugins
Nativity is designed for library authors to expose appropriate methods for use on native object prototypes in a safe manner. See the nativity plugins below for examples. Submit a pull request to add yours to the list.
- nativity-cint
- nativity-fomatto
- nativity-underscore - Coming Soon!