diff --git a/lib/MemberBuilder.js b/lib/MemberBuilder.js index 309d4c6..d59b4b7 100644 --- a/lib/MemberBuilder.js +++ b/lib/MemberBuilder.js @@ -207,22 +207,9 @@ exports.buildProp = function( members, meta, name, value, keywords, base ) */ exports.buildGetter = function( members, meta, name, value, keywords, base ) { - var prev_data = scanMembers( members, name, base ); - this._validate.validateGetterSetter( - name, keywords, prev_data - ); - - Object.defineProperty( - getMemberVisibility( members, keywords, name ), - name, - { - get: value, - enumerable: true, - - // otherwise we can't add a setter to this - configurable: true, - } + this._buildGetterSetter( + 'get', members, meta, name, value, keywords, base ); }; @@ -246,6 +233,36 @@ exports.buildGetter = function( members, meta, name, value, keywords, base ) * @return {undefined} */ exports.buildSetter = function( members, meta, name, value, keywords, base ) +{ + this._buildGetterSetter( + 'set', members, meta, name, value, keywords, base + ); +}; + + +/** + * Copies a getter/setter to the appropriate member prototype, depending on + * visibility, and assigns necessary metadata from keywords + * + * XXX: Combine getter/setter operations for performance benefit + * + * @param {string} type get/set + * + * @param {{public: Object, protected: Object, private: Object}} members + * + * @param {Object} meta metadata container + * @param {string} name getter name + * @param {*} value getter value + * + * @param {Object.} keywords parsed keywords + * + * @param {Object=} base optional base object to scan + * + * @return {undefined} + */ +exports._buildGetterSetter = function( + type, members, meta, name, value, keywords, base +) { var prev_data = scanMembers( members, name, base ); @@ -253,18 +270,21 @@ exports.buildSetter = function( members, meta, name, value, keywords, base ) name, keywords, prev_data ); - this._validate.validateGetterSetter( name, members, keywords, base ); + // the actual data to be set + var data = { + enumerable: true, + + // otherwise we can't add a getter to this + configurable: true, + }; + + // set getter/setter appropriately, depending on the provided type + data[ type ] = value; Object.defineProperty( getMemberVisibility( members, keywords, name ), name, - { - set: value, - enumerable: true, - - // otherwise we can't add a getter to this - configurable: true, - } + data ); };