34 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			34 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "use strict";
 | |
| 
 | |
| var isValue             = require("type/value/is")
 | |
|   , ensureValue         = require("type/value/ensure")
 | |
|   , ensurePlainFunction = require("type/plain-function/ensure")
 | |
|   , copy                = require("es5-ext/object/copy")
 | |
|   , normalizeOptions    = require("es5-ext/object/normalize-options")
 | |
|   , map                 = require("es5-ext/object/map");
 | |
| 
 | |
| var bind = Function.prototype.bind
 | |
|   , defineProperty = Object.defineProperty
 | |
|   , hasOwnProperty = Object.prototype.hasOwnProperty
 | |
|   , define;
 | |
| 
 | |
| define = function (name, desc, options) {
 | |
| 	var value = ensureValue(desc) && ensurePlainFunction(desc.value), dgs;
 | |
| 	dgs = copy(desc);
 | |
| 	delete dgs.writable;
 | |
| 	delete dgs.value;
 | |
| 	dgs.get = function () {
 | |
| 		if (!options.overwriteDefinition && hasOwnProperty.call(this, name)) return value;
 | |
| 		desc.value = bind.call(value, options.resolveContext ? options.resolveContext(this) : this);
 | |
| 		defineProperty(this, name, desc);
 | |
| 		return this[name];
 | |
| 	};
 | |
| 	return dgs;
 | |
| };
 | |
| 
 | |
| module.exports = function (props/*, options*/) {
 | |
| 	var options = normalizeOptions(arguments[1]);
 | |
| 	if (isValue(options.resolveContext)) ensurePlainFunction(options.resolveContext);
 | |
| 	return map(props, function (desc, name) { return define(name, desc, options); });
 | |
| };
 |