333
schangxiang@126.com
2025-09-19 18966e02fb573c7e2bb0c6426ed792b38b910940
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# D
## Property descriptor factory
 
_Originally derived from [es5-ext](https://github.com/medikoo/es5-ext) package._
 
Defining properties with descriptors is very verbose:
 
```javascript
var Account = function () {};
Object.defineProperties(Account.prototype, {
  deposit: { value: function () {
      /* ... */
    }, configurable: true, enumerable: false, writable: true },
  withdraw: { value: function () {
      /* ... */
    }, configurable: true, enumerable: false, writable: true },
  balance: { get: function () {
      /* ... */
    }, configurable: true, enumerable: false }
});
```
 
D cuts that to:
 
```javascript
var d = require('d');
 
var Account = function () {};
Object.defineProperties(Account.prototype, {
  deposit: d(function () {
    /* ... */
  }),
  withdraw: d(function () {
    /* ... */
  }),
  balance: d.gs(function () {
    /* ... */
  })
});
```
 
By default, created descriptor follow characteristics of native ES5 properties, and defines values as:
 
```javascript
{ configurable: true, enumerable: false, writable: true }
```
 
You can overwrite it by preceding _value_ argument with instruction:
```javascript
d('c', value); // { configurable: true, enumerable: false, writable: false }
d('ce', value); // { configurable: true, enumerable: true, writable: false }
d('e', value); // { configurable: false, enumerable: true, writable: false }
 
// Same way for get/set:
d.gs('e', value); // { configurable: false, enumerable: true }
```
 
### Installation
 
    $ npm install d
    
To port it to Browser or any other (non CJS) environment, use your favorite CJS bundler. No favorite yet? Try: [Browserify](http://browserify.org/), [Webmake](https://github.com/medikoo/modules-webmake) or [Webpack](http://webpack.github.io/)
 
### Other utilities
 
#### autoBind(obj, props) _(d/auto-bind)_
 
Define methods which will be automatically bound to its instances
 
```javascript
var d = require('d');
var autoBind = require('d/auto-bind');
 
var Foo = function () { this._count = 0; };
Object.defineProperties(Foo.prototype, autoBind({
  increment: d(function () { ++this._count; });
}));
 
var foo = new Foo();
 
// Increment foo counter on each domEl click
domEl.addEventListener('click', foo.increment, false);
```
 
#### lazy(obj, props) _(d/lazy)_
 
Define lazy properties, which will be resolved on first access
 
```javascript
var d = require('d');
var lazy = require('d/lazy');
 
var Foo = function () {};
Object.defineProperties(Foo.prototype, lazy({
  items: d(function () { return []; })
}));
 
var foo = new Foo();
foo.items.push(1, 2); // foo.items array created and defined directly on foo
```
 
## Tests [![Build Status](https://travis-ci.org/medikoo/d.png)](https://travis-ci.org/medikoo/d)
 
    $ npm test