-
Notifications
You must be signed in to change notification settings - Fork 52
框架设计
LYF edited this page Jul 28, 2016
·
40 revisions
###一、闭包闭住公共变量
var ZingTouch = {
_region:[], // 公共变量
Region: function(){
var id = ZingTouch._region.length;
console.log(id);
ZingTouch._region.push(obj);
}
}
var region = new ZingTouch.Region(); // 0
var region2 = new ZingTouch.Region();// 1
var region3 = new ZingTouch.Region();// 2
https://github.com/zingchart/zingtouch/blob/master/src/ZingTouch.js
###二、不知道作用
var Trigger = function(_element) {
this.element = _element;
this.left = function(_this){
return function(){
return _this.element.left
}
}(this)
}
https://github.com/terwanerik/ScrollTrigger/blob/master/ScrollTrigger.js
###三、定义私有变量
var Trigger = function(_element){
this.element = _element;
var xoffset = 0; // 私有变量
var yoffset = 0; // 私有变量
}
https://github.com/terwanerik/ScrollTrigger/blob/master/ScrollTrigger.js
###四、看avalon源码,很屌的写法
// 惰性函数
function CSPHack(array){
var a = array.reverse().join("")
return function(v){
return window[a].apply(0, v)
}
return window
}
var CSPcompile = CSPHack(["n","o","i","t","c","n","u", "F"])
// 类似于
// var f = Function.apply(0,['a','b','return a + b'])
// f(2, 3); // 5
function CSPcompile(array){
return Object.constructor.apply(0,array)
}
// 一个小技巧。由于与this相关,js引擎总能保证this是一个引用值,所以用call/apply方法时,context随便,第一个参数可写成0,比写成null要好
var $ = document.querySelectAll.bind(document);
var a = 12.3;
a |= 0;
console.log(a); // 12
a = -9.512;
a |= 0;
console.log(a); // -9
var arr = Array(10); // [undefined × 10]
arr[3] = 999;
arr[8] = void 0;
for(var i = 0, n = arr.length; i < n; i++){
if( i in arr ){
console.log(arr[i]); // 999, undefined
}
}
var isES5 = (function(){
"use strict";
return this === undefined;
})();
在bluebird中看到这种写法
var isES5 = (function(){
"use strict";
return this === undefined;
})();
if (isES5) {
module.exports = {
freeze: Object.freeze,
defineProperty: Object.defineProperty,
getDescriptor: Object.getOwnPropertyDescriptor,
keys: Object.keys,
names: Object.getOwnPropertyNames,
getPrototypeOf: Object.getPrototypeOf,
isArray: Array.isArray,
isES5: isES5,
propertyIsWritable: function(obj, prop) {
var descriptor = Object.getOwnPropertyDescriptor(obj, prop);
return !!(!descriptor || descriptor.writable || descriptor.set);
}
};
} else {
var has = {}.hasOwnProperty;
var str = {}.toString;
var proto = {}.constructor.prototype;
var ObjectKeys = function (o) {
var ret = [];
for (var key in o) {
if (has.call(o, key)) {
ret.push(key);
}
}
return ret;
};
var ObjectGetDescriptor = function(o, key) {
return {value: o[key]};
};
var ObjectDefineProperty = function (o, key, desc) {
o[key] = desc.value;
return o;
};
var ObjectFreeze = function (obj) {
return obj;
};
// 记住这个技巧:在try中进行运算,若发生了异常,在catch中返回
// 这样就在不支持或有问题的环境中,也能返回想要的结果
var ObjectGetPrototypeOf = function (obj) {
try {
return Object(obj).constructor.prototype;
}
catch (e) {
return proto;
}
};
// 记住这个技巧。catch中return
var ArrayIsArray = function (obj) {
try {
return str.call(obj) === "[object Array]";
}
catch(e) {
return false;
}
};
module.exports = {
isArray: ArrayIsArray,
keys: ObjectKeys,
names: ObjectKeys,
defineProperty: ObjectDefineProperty,
getDescriptor: ObjectGetDescriptor,
freeze: ObjectFreeze,
getPrototypeOf: ObjectGetPrototypeOf,
isES5: isES5,
propertyIsWritable: function() {
return true;
}
};
}
顺序是:self -> window -> global -> this -> null
var globalObject = typeof self !== "undefined" ? self :
typeof window !== "undefined" ? window :
typeof global !== "undefined" ? global :
this !== undefined ? this : null;
var obj = {b: 2};
Object.defineProperty(obj, 'a', {
enumerable: true,
configurable: true,
get: function(){
console.log(this); // {b: 2}
return 999;
},
set: function(v){
console.log(this); //{b: 2}
this.a = v; // 不能这样干,会栈溢出的
}
})