构造函数用于创建特定类型的对象——不仅声明了使用的对象,构造函数还可以接受参数以便第一次创建对象的时候设置对象的成员值。
你可以自定义自己的构造函数,然后在里面声明自定义类型对象的属性或方法。
**原始包装函数
JavaScript里有3中原始包装函数:number, string, boolean,有时候两种都用:
1 | // 使用原始包装函数 |
推荐,只有在想保留数值状态的时候使用这些包装函数,关于区别可以参考下面的代码:
1 | // 原始string |
构造函数用于创建特定类型的对象——不仅声明了使用的对象,构造函数还可以接受参数以便第一次创建对象的时候设置对象的成员值。
你可以自定义自己的构造函数,然后在里面声明自定义类型对象的属性或方法。
**原始包装函数
JavaScript里有3中原始包装函数:number, string, boolean,有时候两种都用:
1 | // 使用原始包装函数 |
推荐,只有在想保留数值状态的时候使用这些包装函数,关于区别可以参考下面的代码:
1 | // 原始string |
_.throttle
方法源码
1 | /** |
_.debounce
方法源码
1 | /** |
参考阅读
面试的时候还是经常会遇到的一个问题,在逛论坛的时候看到一个挺不错的回答的,所以分享下…
首先,它是解决的一种处理方式。将问题发出方和接收方的类型高度抽象成一个个的整体,
各个整体之间产生的关系后,将会产生某些问题,对这些关系问题的处理,在于各个整体之间的方法实现(怎么突然发现这么拗口呀)
这种处理方法:整体意为对象,方法也叫函数。整个的程序设计叫做面向对象程序设计…
传统面向对象….
1 | var Anim = function(){...}; |
另一种尝试,类面向对象的编程风格
1 | Function.prototype.method = function(name,fn) { |
通过它你可以把事件处理器添加到一个父级元素上,这样就避免了把事件处理器添加到多个子级元素上。事件冒泡以及目标元素。
使用事件代理,我们可以把事件处理器添加到一个元素上,等待一个事件从它的子级元素里冒泡上来,并且可以得知这个事件是从哪个元素开始的。
性能要好
针对新创建的元素,直接可以拥有事件
盒模型d
有两种, IE 盒子模型、标准 W3C 盒子模型;IE的content部分包含了 border 和 padding;
盒模型: 内容(content)、填充(padding)、边界(margin)、 边框(border).
css的position
** absolute
生成绝对定位的元素,相对于 static 定位以外的第一个祖先元素进行定位。
** fixed (老IE不支持)
生成绝对定位的元素,相对于浏览器窗口进行定位。
** relative
生成相对定位的元素,相对于其在普通流中的位置进行定位。
static 默认值。没有定位,元素出现在正常的流中
(忽略 top, bottom, left, right z-index 声明)。
inherit 规定从父元素继承 position 属性的值。
1 |
|
闭包
一个函数能够访问到另一个函数内的变量!函数作为返回值,函数作为参数传递。
this
在函数中this到底取何值,是在函数真正被调用执行的时候确定的,函数定义的时候确定不了
因为this的取值是执行上下文环境的一部分,每次调用函数,都会产生一个新的执行上下文环境。
创建者模式可以将一个复杂对象的构建与其表现形式相分离,使得同样的构建过程可以创建不同的表现形式。
也就是说如果我们用了创建者模式,那么用户只需制定需要建造的类型就可以得到,而具体建造的过程和细节无需了解。上个简单例子….
1 | function getBeerById(id, callback) { |
根据建造者的定义,表相即是回调,也就是说区数据后如何显示和处理取决于回调函数(callback)
相应的回调函数在处理数据的时候不需要关注是如何获取数据的。
我们在jquery的ajax方法里可以看到很多的回调函数,比如success
,error
登回调函数,这些都是创建者模式的经典例子
说白了:创建者模式就是-获取数据与处理数据是分离的!
基本数据类型:number, string, Boolean
复合(应用)数据类型:function, object, array
特殊数据类型:undefined, null
待续……
apply
的妙用合并数组1
2
3var a=[1,2,3], b=[4,5,6]
Array.prototype.push.apply(a, b);
//a = [1,2,3,4,5,6];
数组对象转数组1
var arr = Array.prototype.slice.call(arguments);
用0补全位数1
2
3
4//TODO: 有问题!
function preFixInt(num, length) {
return (num / Math.pow(10,length)).toFixed(length).substr(2);
}
将一个数组插入另一个数组的指定位置1
2
3var a=[1,2,3,7,8,9], b=[4,5,6], insertIndex=3;
a.splice.apply(a, Array.prototype.concat(insertIndex, 0, b));
//a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
快速取数组最大和最小值1
2Math.max.apply(Math, [1,2,3]); //3
Math.min.apply(Math, [1,2,3]); //1
反转字符串1
2var str = "aaaaabbbccccbddddd";
console.log(str.split("").reverse().join(""));
数组去重1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20funciton unq(a) {
var b = [], c = {}, i;
for (i in a) {
c[a[i]] || (b.push(a[i])), c[a[i]] = true;
}
return b;
}
Array.prototype.unq = function () {
var tempArr = [];
var tempObj = {};
for (var i=0; i<this.length; i++) {
if (!(this[i] in tempObj) || !(this[i] === tempObj[this[i]])) {
tempArr.push(this[i]);
tempObj[this[i]] = this[i];
}
}
return tempArr;
}
生成随机数1
2
3
4function randomFrom(low, up) {
var choices = up - low + 1;
return Math.floor(Math.random()*choices + low);
}
所谓单例模式就是在保证一个类只有一个实例,实现的方法一般是先判断实例存在否,如果存在直接返回,如果不存在就创建了再返回。
那如何创建一个单例呢?其中最简单的一个方式是使用对象字面量的方法,其字面量可以包含大量的属性与方法。
1 | var myTest = { |
在扩展对象,可以添加自己的私有成员和方法,使用闭包的形式在其内部封装这些变量和函数声明,只暴露你想要暴露的public成员和方法
1 | var myTest = function() { |
使用的时候var test= myTest(); test.publicMethod();//输出some private
我们也可以在使用的时候才初始化!我们可以再另外一个构造函数里来初始化这些代码。
1 | var myTest = function() { |
调用的时候var bbb = myTest1();bbb.getInstance().publicMethod();//输出Hello World
单例模式.一般用在系统间各种模式的通信协调上。下面是一个单例模式的最佳实践
1 | var BestTest = function() { |