原文:JavaScript技巧&写法

JavaScript技巧篇:

1》状态机

     var state = function () {
this.count = 0;
this.fun = null;
this.nowcount = 0; };
state.prototype = {
load: function (count,fun) {
this.count = count;
this.fun = fun;
this.nowcount=0;
},
trigger: function () {
this.nowcount++;
if (this.nowcount >= this.count){
this.fun();
}
}
}; //--------------

function method1() {
s.trigger();
}
function method2() {
s.trigger();
}
var s = new state();
s.load(2, function () {
console.log('执行完毕');
});
setTimeout(method1, 1000);
setTimeout(method2, 1000);

  状态机一般用在多个任务同时进行的情况下,任务执行到某个阶段执行某个函数!

  场景:同时请求多个异步并发执行(ajax,nodejs的io),并处理结果集合,以上的写法最简单,但却不够优美,

  这是我发现的至今为止最好的一js异步流程文章: http://www.docin.com/p-687111809.html~

2》setTimeout 的特殊应用  

var hander=setTimeout(function () { },100);
clearTimeout(hander);

  场景1》:按钮三次快速点击才触发事件  

     var num = 0;
var hander = 0;
function btnClick() {
if (hander != 0){
clearTimeout(hander);
hander = 0;
}
num++;
if (num >= 3) {
Run();
num = 0;
clearTimeout(hander);
hander = 0;
}
hander = setTimeout(function () {
num = 0;
}, 300);
}
function Run() {
console.log('Run');
}
<input type="button" onclick="btnClick()" value="快速点击三次触发" /> 

  场景2》:快速多次点击只触发最后一次

 	var hander = 0;
function btnClick() {
if (hander != 0) {
clearTimeout(hander);
hander = 0;
}
hander = setTimeout(function () {
Run();
}, 300);
}
function Run() {
console.log('Run');
}
<input type="button" onclick="btnClick()" value="快速点击只触发最后一次" />

其他(长期更新)....

JavaScript写法:

  《. & []》

     var obj = new Object();
obj.add = function (a, b) {
return a + b;
}
console.log(obj.add(1, 2)); var obj2 = new Object();
obj2['add'] = function (a, b) {
return a + b;
}
console.log(obj2.add(1, 2));

  《prototype》 最常见

     var obj = function (name) {
this.name = name;
}
obj.prototype.say = function () {
console.log(this.name);
}
obj.prototype.add = function (a, b) {
return a + n;
}
var o = new obj('fuck');
o.say(); var obj = function (age) {
this.age = age; };
obj.prototype = {
add: function (a, b) {
return this.age;
},
say: function () {
console.log('@');
}
}
var o = new obj(23333);
console.log(o.add());

  《运行创建对象》 简单闭包

    var obj2 = function () {
var _name = '123';
function _add(a, b) {
return a + b+_name;
}
return {
add: _add,
name: _name
};
}();
console.log(obj2.add(1,3));

  Object.create Object.defineProperty

        var obj = function () {
this.add = function () {
console.log('add')
}
}
var outo = new obj();
var o = Object.create(outo, {
sub: {
value: function () {
console.log('sub')
}
}
});
o.add();
o.sub(); 
  var obj = function () {
this.add = function () {
console.log('add')
}
}
var o = new obj();
Object.defineProperty(o, {
"sub": {
value: function () {
console.log('sub')
},
writeable: false
}
});
o.sub();

  __proto__

     var obj = function () {};
obj.prototype = {
add: function () {
console.log('add');
},
sub: function () {
console.log('sub');
}
}; var o = {};//new Object();
o.__proto__ = obj.prototype; o.add();
o.sub();
    var o = {};//new Object();
o.__proto__ = {
add: function () {
console.log('add');
},
sub: function () {
console.log('sub');
}
};
o.__proto__.go = function () {
console.log('go');
} o.add();
o.sub();
o.go();

  call bind

   var obj = new Object();
obj.name = 'myname';
function add() {
console.log(this.name+':add');
}
add.call(obj); var obj = new Object();
obj.name = 'myname';
function add() {
console.log(this.name + ':add');
}
var newadd = add.bind(obj);
newadd();

  

写在最后:

  prototype》function的内置属性

  __proto__》任意对象的内置属性

  add.call(obj)》在obj对象域下执行add apply同是

  add.bind(obj)》给add绑定一个obj对象执行域,obj对象并不会得到add,bind返回一个绑定执行域obj的函数add

  类.add,为静态,不会被实例化

  类.prototype.add,是修改原型,可以实例化 prototype 等价 this

  对象.add 是为对象添加 add ,仅对象使用

  对象.__proto__,是对象的所有属性集,

  表达式:对象.__proto__= 某类.prototype 为原始属性完全继承,对象.__proto__=另一对象.__proto__ 为对象简单深层复制

  表达式:对象.__proto__.add 为对象添加add或修改add,同理:对象.__proto__.add()为执行

  同理:表达式:for (var i in o.__proto__) {console.log(o.__proto__[i])}为遍历对象属性

  表达式:for (var i in 类.prototype ) {}为遍历类属性

     

JavaScript技巧&写法的更多相关文章

  1. Javascript技巧

    Javascript数组转换为CSV格式 首先考虑如下的应用场景,有一个Javscript的字符型(或者数值型)数组,现在需要转换为以逗号分割的CSV格式文件.则我们可以使用如下的小技巧,代码如下: ...

  2. (译文)12个简单(但强大)的JavaScript技巧(二)

    原文链接: 12 Simple (Yet Powerful) JavaScript Tips 其他链接: (译文)12个简单(但强大)的JavaScript技巧(一) 强大的立即调用函数表达式 (什么 ...

  3. (译文)12个简单(但强大)的JavaScript技巧(一)

    原文连接: 12 Simple (Yet Powerful) JavaScript Tips 我将会介绍和解析12个简单但是强大的JavaScript技巧. 这些技巧所有的JavaScript程序员都 ...

  4. 21个值得收藏的Javascript技巧

    1  Javascript数组转换为CSV格式 首先考虑如下的应用场景,有一个Javscript的字符型(或者数值型)数组,现在需要转换为以逗号分割的CSV格式文件.则我们可以使用如下的小技巧,代码如 ...

  5. 12个非常有用的JavaScript技巧

    在这篇文章中,我将分享12个非常有用的JavaScript技巧.这些技巧可以帮助你减少并优化代码. 1) 使用!!将变量转换成布尔类型 有时,我们需要检查一些变量是否存在,或者它是否具有有效值,从而将 ...

  6. 原生JavaScript技巧大收集

    原生JavaScript技巧大收集 地址:http://itindex.net/detail/47244-javascript

  7. 原生JavaScript技巧大收集100个

    原生JavaScript技巧大收集 1.原生JavaScript实现字符串长度截取function cutstr(str, len) { var temp; var icount = 0; var p ...

  8. javascript json写法

    javascript json写法 var shuxing = {name:"super",sex:"19",work:"IT"}; 这个k ...

  9. 【转】45个实用的JavaScript技巧、窍门和最佳实践

    原文:https://colobu.com/2014/09/23/45-Useful-JavaScript-Tips,-Tricks-and-Best-Practices/ 目录 [−] 列表 第一次 ...

随机推荐

  1. libyuv编

     下载代码(墙): git clone http://git.chromium.org/external/libyuv.git 用 make 编译(linux.mingw.cygwin): mak ...

  2. UVa 988 - Many Paths, One Destination

    称号:生命是非常多的选择.现在给你一些选择(0~n-1),和其他选项后,分支数每一次选择,选择共求. 分析:dp,图论.假设一个状态也许是选择的数量0一个是,代表死亡,计数的路径数将达到所有死亡可以去 ...

  3. Nagios监控生产环境redis群集服务战

    前言:     曾经做了cacti上展示redis性能报表图.能够看到redis的性能变化趋势图,可是还缺了实时报警通知的功能,如今补上这一环节. 在redis服务瓶颈或者异常时候即使报警通知,方便d ...

  4. Cocos移植Android-Android.mk编译后的文件

    在以前的博客,我们使用的中年cocos工具C和C++源代码可以编译. 其实cocos工具读取<游戏project文件夹>\proj.android\jni\夹Android.mk文件,.A ...

  5. 重新想象 Windows 8 Store Apps (4) - 控件之提示控件: ProgressRing; 范围控件: ProgressBar, Slider

    原文:重新想象 Windows 8 Store Apps (4) - 控件之提示控件: ProgressRing; 范围控件: ProgressBar, Slider [源码下载] 重新想象 Wind ...

  6. java Socket的怪异之处

    怪异之一: connect(SocketAddress endpoint):这个方法,尝试连接server端,如果连接不上,就抛出IOException异常.如果连接成功了,就继续执行下一步的代码. ...

  7. OS调度算法常用摘要

    一.常见的批处理作业调度 1.先来先服务调度算法(FCFS):就是依照各个作业进入系统的自然次序来调度作业.这样的调度算法的长处是实现简单,公平. 其缺点是没有考虑到系统中各种资源的综合使用情况,往往 ...

  8. 【从翻译mos文章】Weblogic AdminServer 启动fail,报错&quot;unable to get file lock, will retry&quot;

    Weblogic AdminServer 启动fail,报错"unable to get file lock, will retry" 参考原始: Weblogic AdminSe ...

  9. unicode下一个,读取数据库乱码问题

    TCHAR cbContent[512];           dyn.GetFieldValue(0,cbContent,512); // 中文会显示乱码 AfxMessageBox(cbConte ...

  10. POJ 2538 WERTYU水的问题

    [题目简述]:题意非常easy,没有trick. [分析]:事实上这题还是挺有趣的,在 算法竞赛入门经典中也有这一题. 详见代码: // 120K 0Ms /* 边学边做 -- */ // 字符串:W ...