Emerソース学習
12478 ワード
ember.jsは現在最も強力なjavascript MVCフレームワークです.ひげを伸ばした大牛がJS界に駆け込んでこれをやったとき、JS全盛期の到来を示した.
javascriptmvcと聞いたことがあるかもしれません.jsのこの時期はjQueryの支援で有名なフレームワーク、あるいは現在もっと流行しているbackboneですが、emberに比べて.js、それらは暗く色を失いました.しかし、非常にハイエンドに見えるだけに、多くの人を驚かせた.リッチアプリケーションがますます流行している今日、ますます多くの仕事がフロントエンドに移行し、JSのコードは非常に膨大になり、組織するのは難しい問題です.同社がEXTのような強力なUIフレームワークを使用している場合は、言うまでもありません.しかし、多くの会社はjQueryをいじるしかありません.jQueryはスタックコードの利器です.積み上げが速く、倒すのが速いのも特徴です.jQueryは入門しやすいので、開発者が混在しています.もちろん、これは海外に比べて、国内ではコストと中国の特色を考慮して、先端人員の素質が極めて悪く、彼らが書いたjQueryコードは非常に維持しにくいです.そのため、規範と絶束を導入しなければならない.MVCは間違いなくその中で最も信頼できる選択肢だ.皆さんのビジネスコードとUIの作成もMVCの規定に従って書けば、すべてが規則的で、メンテナンスコストが大幅に削減されます.
フレームワークはプログラマーを空欄にする私たち、MVCという強い制約で、プログラマーは流水線の労働者になったと言われています.農民工は土物しかできないが、労働者は精密機器を組み立てることができる.ワクワクしましょう、先端の私たち!あなたたちは今プロレタリア階級の中流砥石--流水線労働者をアップグレードしました!バックエンドのプログラマーがなぜこんなに高いのか分かるでしょう.彼らは10年前、JAVA、C#、C+、JAVAの偉大な枠組みの支配の下で、農業の非転換を実現したからです.後端の工業国家に比べて、先端の国はアフリカの部族首長国連邦のようにかわいそうで、jQueryの現世でも部族民をファラオの民に変えたにすぎない.
本編はここまでですが、Objectのシミュレーションに苦労したことを知っています.definePropertiesは、METAメカニズムを作って、しばらく何の役にも立たない.
javascriptmvcと聞いたことがあるかもしれません.jsのこの時期はjQueryの支援で有名なフレームワーク、あるいは現在もっと流行しているbackboneですが、emberに比べて.js、それらは暗く色を失いました.しかし、非常にハイエンドに見えるだけに、多くの人を驚かせた.リッチアプリケーションがますます流行している今日、ますます多くの仕事がフロントエンドに移行し、JSのコードは非常に膨大になり、組織するのは難しい問題です.同社がEXTのような強力なUIフレームワークを使用している場合は、言うまでもありません.しかし、多くの会社はjQueryをいじるしかありません.jQueryはスタックコードの利器です.積み上げが速く、倒すのが速いのも特徴です.jQueryは入門しやすいので、開発者が混在しています.もちろん、これは海外に比べて、国内ではコストと中国の特色を考慮して、先端人員の素質が極めて悪く、彼らが書いたjQueryコードは非常に維持しにくいです.そのため、規範と絶束を導入しなければならない.MVCは間違いなくその中で最も信頼できる選択肢だ.皆さんのビジネスコードとUIの作成もMVCの規定に従って書けば、すべてが規則的で、メンテナンスコストが大幅に削減されます.
フレームワークはプログラマーを空欄にする私たち、MVCという強い制約で、プログラマーは流水線の労働者になったと言われています.農民工は土物しかできないが、労働者は精密機器を組み立てることができる.ワクワクしましょう、先端の私たち!あなたたちは今プロレタリア階級の中流砥石--流水線労働者をアップグレードしました!バックエンドのプログラマーがなぜこんなに高いのか分かるでしょう.彼らは10年前、JAVA、C#、C+、JAVAの偉大な枠組みの支配の下で、農業の非転換を実現したからです.後端の工業国家に比べて、先端の国はアフリカの部族首長国連邦のようにかわいそうで、jQueryの現世でも部族民をファラオの民に変えたにすぎない.
if ('undefined' === typeof Ember) {
Ember = {};
//
if ('undefined' !== typeof window) {
window.Em = window.Ember = Em = Ember;
}
}
Ember.isNamespace = true;
Ember.toString = function() {
return "Ember";
};
Ember.VERSION = '0.9.8.1';
Ember.ENV = 'undefined' === typeof ENV ? {} : ENV;
// , volatile
Ember.CP_DEFAULT_CACHEABLE = (Ember.ENV.CP_DEFAULT_CACHEABLE !== false);
Ember.VIEW_PRESERVES_CONTEXT = (Ember.ENV.VIEW_PRESERVES_CONTEXT !== false);
Ember.K = function() {
return this;
};
//
if ('undefined' === typeof Ember.assert) {
Ember.assert = Ember.K;
}
if ('undefined' === typeof Ember.warn) {
Ember.warn = Ember.K;
}
if ('undefined' === typeof Ember.deprecate) {
Ember.deprecate = Ember.K;
}
if ('undefined' === typeof Ember.deprecateFunc) {
Ember.deprecateFunc = function(_, func) {
return func;
};
}
//
if ('undefined' === typeof ember_assert) {
window.ember_assert = Ember.K;
}
if ('undefined' === typeof ember_warn) {
window.ember_warn = Ember.K;
}
if ('undefined' === typeof ember_deprecate) {
window.ember_deprecate = Ember.K;
}
if ('undefined' === typeof ember_deprecateFunc) {
window.ember_deprecateFunc = function(_, func) {
return func;
};
}
//
Ember.Logger = window.console || {
log: Ember.K,
warn: Ember.K,
error: Ember.K
};
//
var platform = Ember.platform = {} ;
// , Object.create
platform.create = Object.create;
if (!platform.create) {
//
var O_ctor = function() {},
O_proto = O_ctor.prototype;
platform.create = function(obj, descs) {
O_ctor.prototype = obj;
obj = new O_ctor();
O_ctor.prototype = O_proto;
if (descs !== undefined) {
for(var key in descs) {
if (!descs.hasOwnProperty(key)) continue;
//
platform.defineProperty(obj, key, descs[key]);
}
}
return obj;
};
//
platform.create.isSimulated = true;
}
var defineProperty = Object.defineProperty;
var canRedefineProperties, canDefinePropertyOnDOM;
//IE8 Object.defineProperty , DOM
if (defineProperty) {
try {
defineProperty({}, 'a',{
get:function(){}
});
} catch (e) {
/** @private */
defineProperty = null;
}
}
// BUG
if (defineProperty) {
// Detects a bug in Android <3.2 where you cannot redefine a property using
// Object.defineProperty once accessors have already been set.
/** @private */
canRedefineProperties = (function() {
var obj = {};
defineProperty(obj, 'a', {
configurable: true,
enumerable: true,
get: function() { },
set: function() { }
});
defineProperty(obj, 'a', {
configurable: true,
enumerable: true,
writable: true,
value: true
});
return obj.a === true;
})();
// This is for Safari 5.0, which supports Object.defineProperty, but not
// on DOM nodes.
/** @private */
canDefinePropertyOnDOM = (function(){
try {
defineProperty(document.createElement('div'), 'definePropertyOnDOM', {});
return true;
} catch(e) { }
return false;
})();
if (!canRedefineProperties) {
/** @private */
defineProperty = null;
} else if (!canDefinePropertyOnDOM) {
/** @private */
defineProperty = function(obj, keyName, desc){
var isNode;
if (typeof Node === "object") {
isNode = obj instanceof Node;
} else {
isNode = typeof obj === "object" && typeof obj.nodeType === "number" && typeof obj.nodeName === "string";
}
if (isNode) {
// TODO: Should we have a warning here?
return (obj[keyName] = desc.value);
} else {
return Object.defineProperty(obj, keyName, desc);
}
};
}
}
platform.defineProperty = defineProperty;
platform.hasPropertyAccessors = true;
if (!platform.defineProperty) {
platform.hasPropertyAccessors = false;
platform.defineProperty = function(obj, keyName, desc) {
ember_assert("property descriptor cannot have `get` or `set` on this platform", !desc.get && !desc.set);
obj[keyName] = desc.value;// , value
};
platform.defineProperty.isSimulated = true;
}
// UUID
var GUID_KEY = '__ember'+ (+ new Date());
var uuid, numberCache, stringCache;
uuid = 0;
numberCache = [];
stringCache = {};
//
var GUID_DESC = Ember.GUID_DESC = {
configurable: true,
writable: true,
enumerable: false
};
var o_defineProperty = Ember.platform.defineProperty;
var o_create = Ember.platform.create;
Ember.GUID_KEY = GUID_KEY;
// UUID
Ember.generateGuid = function(obj, prefix) {
if (!prefix) prefix = 'ember';
var ret = (prefix + (uuid++));
if (obj) {
GUID_DESC.value = ret;
o_defineProperty(obj, GUID_KEY, GUID_DESC);
GUID_DESC.value = null;
}
return ret ;
};
// UUID ,UUID , ,
Ember.guidFor = function(obj) {
// special cases where we don't want to add a key to object
if (obj === undefined) return "(undefined)";
if (obj === null) return "(null)";
var cache, ret;
var type = typeof obj;
switch(type) {
case 'number'://
ret = numberCache[obj];
if (!ret) ret = numberCache[obj] = 'nu'+obj;
return ret;
case 'string'://
ret = stringCache[obj];
if (!ret) ret = stringCache[obj] = 'st'+(uuid++);
return ret;
case 'boolean'://
return obj ? '(true)' : '(false)';
default:
if (obj[GUID_KEY]) return obj[GUID_KEY];
if (obj === Object) return '(Object)';//
if (obj === Array) return '(Array)';//
return Ember.generateGuid(obj, 'ember');
}
};
//
var META_DESC = {//
writable: true,
configurable: false,
enumerable: false,
value: null
};
var META_KEY = Ember.GUID_KEY+'_meta';
Ember.META_KEY = META_KEY;
// Placeholder for non-writable metas.
var EMPTY_META = {//
descs: {},
watching: {}
};
if (Object.freeze) Object.freeze(EMPTY_META);
var createMeta = Ember.platform.defineProperty.isSimulated ? o_create : (function(meta) { return meta; });
Ember.meta = function meta(obj, writable) {
var ret = obj[META_KEY];
if (writable===false) return ret || EMPTY_META;// ,
if (!ret) {//
o_defineProperty(obj, META_KEY, META_DESC);
ret = obj[META_KEY] = createMeta({
descs: {},
watching: {},
values: {},
lastSetValues: {},
cache: {},
source: obj
});
// make sure we don't accidentally try to create constructor like desc
ret.descs.constructor = null;
} else if (ret.source !== obj) {
ret = o_create(ret);//
ret.descs = o_create(ret.descs);//
ret.values = o_create(ret.values);//
ret.watching = o_create(ret.watching);//
ret.lastSetValues = {};
ret.cache = {};
ret.source = obj;
o_defineProperty(obj, META_KEY, META_DESC);
ret = obj[META_KEY] = createMeta(ret);
}
return ret;
};
//
Ember.getMeta = function getMeta(obj, property) {
var meta = Ember.meta(obj, false);
return meta[property];
};
Ember.setMeta = function setMeta(obj, property, value) {
var meta = Ember.meta(obj, true);
meta[property] = value;
return value;
};
Ember.metaPath = function(obj, path, writable) {
var meta = Ember.meta(obj, writable), keyName, value;
for (var i=0, l=path.length; i<l; i++) {
keyName = path[i];
value = meta[keyName];
if (!value) {
if (!writable) { return undefined; }
value = meta[keyName] = { __ember_source__: obj };
} else if (value.__ember_source__ !== obj) {
if (!writable) { return undefined; }
value = meta[keyName] = o_create(value);
value.__ember_source__ = obj;
}
meta = value;
}
return value;
};
Ember.wrap = function(func, superFunc) {
function K() {}
var newFunc = function() {
var ret, sup = this._super;
this._super = superFunc || K;
ret = func.apply(this, arguments);
this._super = sup;
return ret;
};
newFunc.base = func;
return newFunc;
};
//
mber.isArray = function(obj) {
if (!obj || obj.setInterval) { return false; }
if (Array.isArray && Array.isArray(obj)) { return true; }
if (Ember.Array && Ember.Array.detect(obj)) { return true; }
if ((obj.length !== undefined) && 'object'===typeof obj) { return true; }
return false;
};
//
// Ember.makeArray(); => []
// Ember.makeArray(null); => []
// Ember.makeArray(undefined); => []
// Ember.makeArray('lindsay'); => ['lindsay']
// Ember.makeArray([1,2,42]); => [1,2,42]
Ember.makeArray = function(obj) {
if (obj === null || obj === undefined) return [];
return Ember.isArray(obj) ? obj : [obj];
};
本編はここまでですが、Objectのシミュレーションに苦労したことを知っています.definePropertiesは、METAメカニズムを作って、しばらく何の役にも立たない.