JavaScript技巧&写法

时间:2022-09-07 23:48:13

原文: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. &lpar;译文&rpar;12个简单&lpar;但强大&rpar;的JavaScript技巧&lpar;二&rpar;

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

  3. &lpar;译文&rpar;12个简单&lpar;但强大&rpar;的JavaScript技巧&lpar;一&rpar;

    原文连接: 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. BZOJ 2818&colon; Gcd &lbrack;欧拉函数 质数 线性筛&rsqb;【学习笔记】

    2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 4436  Solved: 1957[Submit][Status][Discuss ...

  2. DevExpress 标题栏添加搜索功能

    上图是效果图 附件示例代码下载

  3. asp&period;net MVC 模拟实现与源码分析

    前言 本文流程#1: 从一个空项目->模拟实现一个从/Home/Test形式的URL敲入->后台逻辑处理->传入后台model参数->调用razor引擎->前台展示 涉及 ...

  4. JAVAscript学习笔记 js异常 第二节 (原创) 参考js使用表

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. Quartz基本使用

    1.Quartz概述:简单的说就是java的一个定时任务的框架,没有那么复杂的解释,跟前端的定时器一样.在了解它之前,首先熟悉几个概念. 2.基本概念 2.1 Job:表示一个工作,要执行的具体内容. ...

  6. DS-1

    一.作业题目 仿照三元组或复数的抽象数据类型写出有理数抽象数据类型的描述 (有理数是其分子.分母均为整数且分母不为零的分数). 有理数基本运算: 构造有理数T,元素e1,e2分别被赋以分子.分母值 销 ...

  7. springboot之rabbitmq

    一.RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件).RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的.所有 ...

  8. 一条慢SQL引发的血案

    直接切入正题吧: 通常来说,我们看到的慢查询一般还不致于导致挂站,顶多就是应用响应变慢不过这个恰好今天被我撞见了,一个慢查询把整个网站搞挂了先看看这个SQL张撒样子: # Query_time: 70 ...

  9. gitHub新项目的上传

    github作为一个开源托管平台,除了有机会学习各位大神的开源项目,还能托管自己写的一些小Demo,作为github新进菜鸟,今天就整理下上传Demo所需的命令和操作步骤,防止我这谜一样的记忆力. 1 ...

  10. MySQL当中的case when then

    其实就相当于if else:而且也可以用if来替代. case whent 条件1 then 条件2 else 条件3 end; 如果条件1成立就执行条件2否则执行条件3 mysql ) end; + ...