123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- /*!
- * copy-to - index.js
- * Copyright(c) 2014 dead_horse <dead_horse@qq.com>
- * MIT Licensed
- */
- 'use strict';
- /**
- * slice() reference.
- */
- var slice = Array.prototype.slice;
- /**
- * Expose copy
- *
- * ```
- * copy({foo: 'nar', hello: 'copy'}).to({hello: 'world'});
- * copy({foo: 'nar', hello: 'copy'}).toCover({hello: 'world'});
- * ```
- *
- * @param {Object} src
- * @return {Copy}
- */
- module.exports = Copy;
- /**
- * Copy
- * @param {Object} src
- * @param {Boolean} withAccess
- */
- function Copy(src, withAccess) {
- if (!(this instanceof Copy)) return new Copy(src, withAccess);
- this.src = src;
- this._withAccess = withAccess;
- }
- /**
- * copy properties include getter and setter
- * @param {[type]} val [description]
- * @return {[type]} [description]
- */
- Copy.prototype.withAccess = function (w) {
- this._withAccess = w !== false;
- return this;
- };
- /**
- * pick keys in src
- *
- * @api: public
- */
- Copy.prototype.pick = function(keys) {
- if (!Array.isArray(keys)) {
- keys = slice.call(arguments);
- }
- if (keys.length) {
- this.keys = keys;
- }
- return this;
- };
- /**
- * copy src to target,
- * do not cover any property target has
- * @param {Object} to
- *
- * @api: public
- */
- Copy.prototype.to = function(to) {
- to = to || {};
- if (!this.src) return to;
- var keys = this.keys || Object.keys(this.src);
- if (!this._withAccess) {
- for (var i = 0; i < keys.length; i++) {
- key = keys[i];
- if (to[key] !== undefined) continue;
- to[key] = this.src[key];
- }
- return to;
- }
- for (var i = 0; i < keys.length; i++) {
- var key = keys[i];
- if (!notDefined(to, key)) continue;
- var getter = this.src.__lookupGetter__(key);
- var setter = this.src.__lookupSetter__(key);
- if (getter) to.__defineGetter__(key, getter);
- if (setter) to.__defineSetter__(key, setter);
- if (!getter && !setter) {
- to[key] = this.src[key];
- }
- }
- return to;
- };
- /**
- * copy src to target,
- * override any property target has
- * @param {Object} to
- *
- * @api: public
- */
- Copy.prototype.toCover = function(to) {
- var keys = this.keys || Object.keys(this.src);
- for (var i = 0; i < keys.length; i++) {
- var key = keys[i];
- delete to[key];
- var getter = this.src.__lookupGetter__(key);
- var setter = this.src.__lookupSetter__(key);
- if (getter) to.__defineGetter__(key, getter);
- if (setter) to.__defineSetter__(key, setter);
- if (!getter && !setter) {
- to[key] = this.src[key];
- }
- }
- };
- Copy.prototype.override = Copy.prototype.toCover;
- /**
- * append another object to src
- * @param {Obj} obj
- * @return {Copy}
- */
- Copy.prototype.and = function (obj) {
- var src = {};
- this.to(src);
- this.src = obj;
- this.to(src);
- this.src = src;
- return this;
- };
- /**
- * check obj[key] if not defiend
- * @param {Object} obj
- * @param {String} key
- * @return {Boolean}
- */
- function notDefined(obj, key) {
- return obj[key] === undefined
- && obj.__lookupGetter__(key) === undefined
- && obj.__lookupSetter__(key) === undefined;
- }
|