enyo学习之enyo.Object类

     enyo.Object类是Enyo的基类,它实现了框架属性的一些公共方法。官方API文档给出了该类中几个方法的名称、参数和作用。

: function(inName)  销毁名为inName的对象

: function(n)  返回名称为‘n’的属性的值

: function(n, v)  将名称为‘n’的属性赋值为‘v’

: function()  向控制台发送log信息

: function()  和log类似,但是使用的是控制台的warn方法(如果存在该方法)

: function() 和log类似,但是使用的是控制台的error方法(如果存在该方法)

    接下来简单看一下enyo.Object类的源码

  1 enyo.kind({
  2     name: "enyo.Object",
  3     //* @protected
  4     // kind为空,没有父类
  5     kind: null,
  6     constructor: function() {
  7         enyo._objectCount++;
  8     },
  9     /**
 10         将名称为‘n’的属性值设置为‘v’,如果有回调方法cf则调用回调方法并将原来的值作为参数。
 11         所有属性的set方法都阻塞在这里以便对象观察属性的变化情况
 12     */
 13     setPropertyValue: function(n, v, cf) {
 14         if (this[cf]) {
 15             var old = this[n];
 16             this[n] = v;
 17             this[cf](old);
 18         } else {
 19             this[n] = v;
 20         }
 21     },
 22     _setProperty: function(n, v, cf) {
 23         this.setPropertyValue(n, v, (this.getProperty(n) !== v) && cf);
 24     },
 25     //* @public
 26     destroyObject: function(inName) {
 27         if (this[inName] && this[inName].destroy) {
 28             this[inName].destroy();
 29         }
 30         this[inName] = null;
 31     },
 32     getProperty: function(n) {
 33         var getter = "get" + enyo.cap(n);
 34         if (this[getter]) {
 35             return this[getter]();
 36         }
 37         return this[n];
 38     },
 39     /**
 40         设置属性值,如果该属性由set方法则调用set方法,否则调用_setProperty方法,并使用属性的Changed方法作为回调函数
 41     */
 42     setProperty: function(n, v) {
 43         var setter = "set" + enyo.cap(n);
 44         if (this[setter]) {
 45             this[setter](v);
 46         } else {
 47             this._setProperty(n, v, n + "Changed");
 48         }
 49     },
 50     /**
 51         Sends a log message to the console, prepended with the name of the kind
 52         and method from which _log_ was invoked.  Multiple arguments are coerced
 53         to String and joined with spaces.
 54 
 55             enyo.kind({
 56                 name: "MyObject",
 57                 kind: enyo.Object,
 58                 hello: function() {
 59                     this.log("says", "hi");
 60                     // shows in the console: MyObject.hello: says hi
 61                 }
 62             });
 63     */
 64     log: function() {
 65         var acc = arguments.callee.caller;
 66         var nom = ((acc ? acc.nom : "") || "(instance method)") + ":";
 67         enyo.logging.log("log", [nom].concat(enyo.cloneArray(arguments)));
 68     },
 69     //* Same as _log_, except uses the console's warn method (if it exists).
 70     warn: function() {
 71         this._log("warn", arguments);
 72     },
 73     //* Same as _log_, except uses the console's error method (if it exists).
 74     error: function() {
 75         this._log("error", arguments);
 76     },
 77     //* @protected
 78     _log: function(inMethod, inArgs) {
 79         if (enyo.logging.shouldLog(inMethod)) {
 80             try {
 81                 throw new Error();
 82             } catch(x) {
 83                 enyo.logging._log(inMethod, [inArgs.callee.caller.nom + ": "].concat(enyo.cloneArray(inArgs)));
 84                 console.log(x.stack);
 85             }
 86         }
 87     }
 88 });
 89 
 90 //* @protected
 91 //对象计数器
 92 enyo._objectCount = 0;
 93 
 94 enyo.Object.subclass = function(ctor, props) {
 95     this.publish(ctor, props);
 96 };
 97 
 98 /**
 99     为对象的publish属性添加get、set方法
100 */
101 enyo.Object.publish = function(ctor, props) {
102     var pp = props.published;
103     if (pp) {
104         var cp = ctor.prototype;
105         for (var n in pp) {
106             enyo.Object.addGetterSetter(n, pp[n], cp);
107         }
108     }
109 };
110 
111 /**
112     为对象的属性添加get、set方法的实现代码,注意添加set方法时将Changed方法作为了回调函数
113 */
114 enyo.Object.addGetterSetter = function(inName, inValue, inProto) {
115     var priv_n = inName;
116     inProto[priv_n] = inValue;
117     //
118     var cap_n = enyo.cap(priv_n); 
119     var get_n = "get" + cap_n;
120     if (!inProto[get_n]) {
121         inProto[get_n] = function() { 
122             return this[priv_n];
123         };
124     }
125     //
126     var set_n = "set" + cap_n;
127     var change_n = priv_n + "Changed";
128     if (!inProto[set_n]) {
129         inProto[set_n] = function(v) { 
130             this._setProperty(priv_n, v, change_n); 
131         };
132     }
133 };

      JavaScript没有深入系统的学过,只能简单的理解一下。

posted @ 2013-01-07 20:47  外卖  阅读(337)  评论(0编辑  收藏  举报