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技巧&写法的更多相关文章
- Javascript技巧
Javascript数组转换为CSV格式 首先考虑如下的应用场景,有一个Javscript的字符型(或者数值型)数组,现在需要转换为以逗号分割的CSV格式文件.则我们可以使用如下的小技巧,代码如下: ...
- (译文)12个简单(但强大)的JavaScript技巧(二)
原文链接: 12 Simple (Yet Powerful) JavaScript Tips 其他链接: (译文)12个简单(但强大)的JavaScript技巧(一) 强大的立即调用函数表达式 (什么 ...
- (译文)12个简单(但强大)的JavaScript技巧(一)
原文连接: 12 Simple (Yet Powerful) JavaScript Tips 我将会介绍和解析12个简单但是强大的JavaScript技巧. 这些技巧所有的JavaScript程序员都 ...
- 21个值得收藏的Javascript技巧
1 Javascript数组转换为CSV格式 首先考虑如下的应用场景,有一个Javscript的字符型(或者数值型)数组,现在需要转换为以逗号分割的CSV格式文件.则我们可以使用如下的小技巧,代码如 ...
- 12个非常有用的JavaScript技巧
在这篇文章中,我将分享12个非常有用的JavaScript技巧.这些技巧可以帮助你减少并优化代码. 1) 使用!!将变量转换成布尔类型 有时,我们需要检查一些变量是否存在,或者它是否具有有效值,从而将 ...
- 原生JavaScript技巧大收集
原生JavaScript技巧大收集 地址:http://itindex.net/detail/47244-javascript
- 原生JavaScript技巧大收集100个
原生JavaScript技巧大收集 1.原生JavaScript实现字符串长度截取function cutstr(str, len) { var temp; var icount = 0; var p ...
- javascript json写法
javascript json写法 var shuxing = {name:"super",sex:"19",work:"IT"}; 这个k ...
- 【转】45个实用的JavaScript技巧、窍门和最佳实践
原文:https://colobu.com/2014/09/23/45-Useful-JavaScript-Tips,-Tricks-and-Best-Practices/ 目录 [−] 列表 第一次 ...
随机推荐
- poj 3250 Bad Hair Day (单调栈)
Bad Hair Day Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 14883 Accepted: 4940 Des ...
- 13-7-5 android Tabhost功能实现
开始使用了一个Activity做界面切换,采用visible.gone写法,感觉太麻烦了. layoutHousehold.setVisibility(View.GONE); layoutCamera ...
- uva10635 LCS映射转LIS
题目给定 2个序列,要我们求LCS,但是序列的长度最长是250*250, LCS的时间复杂度是O(N*N),所以无法解决 我们可以第一个序列的数字,按位置,映射为1.2.3.4.5.6.7.8.9 那 ...
- 二分图行列匹配---> hdu2119,hdu1498
hdu2119 题意:给定一个矩形方格,每个格子里面的数字是0或者1,每次操作可以把一整行或列的1变成0,问最少多少次操作能将1全部变为0 一次可以消除某一行或者某一列的1但是可以这么想,最多有多少个 ...
- TCP/IP详细说明--滑模、拥塞窗口、慢启动、Negle算法
TCP的数据流大致能够分为两类,交互数据流与成块的数据流. 交互数据流就是发送控制命令的数据流.比方relogin,telnet.ftp命令等等.成块数据流是用来发送数据的包,网络上大部分的TCP包都 ...
- 全文检索引擎Solr 指南
全文检索引擎Solr系列:第一篇:http://t.cn/RP004gl.第二篇:http://t.cn/RPHDjk7 .第三篇:http://t.cn/RPuJt3T
- ps命令用法详解(转)
ps p 22763 -L -o pcpu,pid,tid,time,tname,cmd,pmem,rss --sort rss 按rss排序 ps p 26653 -L -o pcpu,tid ...
- Java Swing 绝对布局管理方法,null布局(转)
首先把相关容器的布局方式设为 setLayout(null); 然后调用组件的 setBounds() 方法 设置button的位置为(100,100) 长宽分别为 60,25 jButton.se ...
- 设计模式 - 出厂模式(factory pattern) 详细说明
出厂模式(factory pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/27081511 工厂方法模式 ...
- MonkenRunner通过HierarchyViewer定位控制的方法和建议(Appium/UIAutomator/Robotium侣)
1. 背景 正在使用MonkeyRunner当我们经常使用Chimchat下面HierarchyViewer模块获得目标控制的一些信息,以协助我们测试.但在MonkeyRunner官方的说法是没有看到 ...