Skip to content

curried and reusable defineProperties function like Object.defineProperties

Notifications You must be signed in to change notification settings

octo-utils/object-assign-properties

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

36 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

object-assign-properties

npm

npm

curried and reusable function define object properties like Object.defineProperties

Usage & Arguments

objectAssignProperties(descriptor[, properties[, object]])

((descriptor, properties, object) => *) => descriptor => properties => object => object

there are 3 arguments of this curried function.

  • descriptor description for properties (description)

  • properties properties with it's value

  • object target object

example

const objectAssignProperties = require("object-assign-properties");

const objectAssignPropertiesReadonly = objectAssignProperties({
    writable:false,
    configurable:false
})

getter/setter

getter and setter description would be little different from built-in ones

because of objectAssignProperties always assign mutable properties for mutable objects, so we need more property infos in our accessor functions

you can define getter and setter like this example below:

const objectAssignProperties = require("object-assign-properties");

const objectAssignPropertiesWithAccessor = objectAssignProperties({
   get(lastValue, key, self) { // inital or last value will save in a interal scope
       return lastValue + 1;
   }
   set(lastValue, newValue, prop, self) {
       if (typeof newValue === "number") {
          return newValue; // return value would be set as a new value for the property
       } else {
          return lastValue;
       }
   }
})

Example

normal description

const objectAssignProperties = require("object-assign-properties");

let target = {};

objectAssignProperties({
    writable:false,
    configurable:false
}, {
    a:1
    b:2
}, target);

console.log(target); // assign readonly properties `a` `b` `c` to target object

normal description (curry)

const objectAssignProperties = require("object-assign-properties");

const objectAssignPropertiesReadonly = objectAssignProperties({
    writable:false,
    configurable:false
});

const objectAssignPropertiesReadonlyABC = objectAssignPropertiesReadonly({
    a:1, b:2, c:3
})

let target1 = {};
let target2 = {};

objectAssignPropertiesReadonlyABC(target1); // assign readonly properties `a` `b` `c` to target object
objectAssignPropertiesReadonlyABC(target2);

accessor description (getter and setter)

const objectAssignProperties = require("object-assign-properties");

const objectAssignPropertiesGetPlus1 = objectAssignProperties({
    get(value, key){
        return value + 1;
    }
}, {
    a:1, b:2, c:"c"
})

let target1 = {};
let target2 = {};

objectAssignPropertiesGetPlus1(target1);
objectAssignPropertiesGetPlus1(target2);

console.log(target1.a) // 2;
console.log(target1.b) // 3;
console.log(target1.c) // "c1";

console.log(target2.a) // 2;
console.log(target2.b) // 3;
console.log(target2.c) // "c1";

Benchmark (nodejs v7.3.0 | macOS | 2.2 GHz Intel Core i7)

Benchmark sources can be found in the folder

1.create assign properties for object

assign a,b,c, with enumerable:false and writable:false

function \ ops/sec create
Object.defineProperties 530,060
object-assign-properties 223,242
object-assign-properties curry 1 argument 219,352
object-assign-properties curry 2 arguments 215,466

2.call assigned properties with accessor (getter and setter)

assigned a property with getter and setter, then object[property] = object[property] + 1

function \ ops/sec call first object call second object call third object
object-assign-properties 60,629,790 27,843,142 26,903,146
Object.defineProperties 77,280,414 3,825,480 3,832,452

why object-assign-properties performance better after the first object ?

reference issue nodejs/help|#442

objects with the same property name and different function defined via accessor (getter/setter) (even with the same return value) are always turned to dictionary mode expect the first one, however if we always define same function for accessor of the same property name, then the object will stay fast!

Reference

dependencies

About

curried and reusable defineProperties function like Object.defineProperties

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published