diff --git a/demo/index.html b/demo/index.html index 4ac9fc3..144a5f6 100644 --- a/demo/index.html +++ b/demo/index.html @@ -15,7 +15,7 @@ baseUrl: '../src' }); -require(['oo'], function (Class) { +require(['main'], function (Class) { var Super = Class({ superProp1: 'superProp1', superProp2: 'superProp2', @@ -240,6 +240,17 @@ var e2 = new EooClass2('prop1', 'prop2'); e2.test(); + + Class.defineAccessor(Sub.prototype, 'testProp'); + window.accessorSub = new Sub(); + console.log(accessorSub.setTestProp); + console.log(accessorSub.getTestProp); + + accessorSub.setTestProp('test'); + printLine(accessorSub.getTestProp()); + accessorSub.setTestProp('test1'); + printLine(accessorSub.getTestProp()); + }); diff --git a/src/defineAccessor.js b/src/defineAccessor.js new file mode 100644 index 0000000..83f6698 --- /dev/null +++ b/src/defineAccessor.js @@ -0,0 +1,48 @@ +/** + * Created by exodia on 14-8-28. + */ +void function (define, undefined) { + + define( + function (require) { + var MEMBERS = '__eooPrivateMembers__'; + + function simpleGetter(name) { + var body = 'return typeof this.' + MEMBERS + ' === \'object\' ? this.' + + MEMBERS + '[\'' + name + '\'] : undefined;'; + return new Function(body); + } + + function simpleSetter(name) { + var body = 'this.' + MEMBERS + ' = this.' + MEMBERS + ' || {};\n' + + 'this.' + MEMBERS + '[\'' + name + '\'] = value;' ; + return new Function('value', body); + } + + /** + * 根据指定的属性名生成对应的accessor + * + * @param {Object | Function} obj 需要生成 accessor 的对象 + * @param {string} name 需要生成 accessor 的属性名称 + * @param {Object | Function} [accessor] 自定义的 getter 和 setter 配置 + * @param {Function} [accessor.get] 自定义的 getter 函数, 配置了accessor,但未设置 get,则不会生成 getter + * @param {Function} [accessor.set] 自定义的 setter 函数, 配置了accessor,但未设置 set,则不会生成 setter + */ + return function (obj, name, accessor) { + var upperName = name.charAt(0).toUpperCase() + name.slice(1); + var getter = 'get' + upperName; + var setter = 'set' + upperName; + + if (!accessor) { + obj[getter] = !accessor || typeof accessor.get !== 'function' ? simpleGetter(name) : accessor.get; + obj[setter] = !accessor || typeof accessor.set !== 'function' ? simpleSetter(name) : accessor.set; + } + else { + typeof accessor.get === 'function' && (obj[getter] = accessor.get); + typeof accessor.set === 'function' && (obj[setter] = accessor.set); + } + }; + } + ); + +}(typeof define === 'function' && define.amd ? define : function (factory) { module.exports = factory(require); }); \ No newline at end of file diff --git a/src/main.js b/src/main.js new file mode 100644 index 0000000..d2dfdd7 --- /dev/null +++ b/src/main.js @@ -0,0 +1,13 @@ +/** + * Created by exodia on 14-8-28. + */ +void function (define) { + define( + function (require) { + var oo = require('./oo'); + oo.defineAccessor = require('./defineAccessor'); + + return oo; + } + ); +}(typeof define === 'function' && define.amd ? define : function (factory) { module.exports = factory(require); }); \ No newline at end of file diff --git a/src/oo.js b/src/oo.js index 5674d8b..b67d614 100644 --- a/src/oo.js +++ b/src/oo.js @@ -3,9 +3,9 @@ // - demo void function (define) { define(function () { - var Empty = function () {}; - var NAME_PROPERTY_NAME = '__name__'; - var OWNER_PROPERTY_NAME = '__owner__'; + var Empty = function () { }; + var NAME_PROPERTY_NAME = '__eooName__'; + var OWNER_PROPERTY_NAME = '__eooOwner__'; /** * 简单的 js oo 库 @@ -173,21 +173,8 @@ void function (define) { */ function inherit(BaseClass) { var kclass = function () { - /** - * 若未进行 constructor 的重写,则klass.prototype.constructor指向BaseClass.prototype.constructor - */ + // 若未进行 constructor 的重写,则klass.prototype.constructor指向BaseClass.prototype.constructor return kclass.prototype.constructor.apply(this, arguments); - - // 下面是之前的代码,我也不知道为什么写的这么多,还有 bug- -!!5555~~ - - // 兼容非 oo 创建的类继承 oo 类时的构造函数调用 - /*if (kclass.caller === this.constructor) { - return kclass.prototype.constructor.apply(this, arguments); - } - - return this.constructor !== kclass && - typeof this.constructor == 'function' && - this.constructor.apply(this, arguments);*/ }; Empty.prototype = BaseClass.prototype;