chapter 3: 对象
- null and undefine
null 是对象使用;undefined是属性使用
var obj = {"first":"Kevin","last":"Ge"}
判断是否是null if(obj["middle"] == null)
判断是否是undefine if(typeof obj["middle"] == "undefine")
或 if(obj["middle"] === undefine) - 属性默认值
var middle = obj["middle"] || "null"; - 更新
如果属性存在就更新,如果属性不存在,就新建这个属性
var obj["first_name"] = "first_name";
obj.nickname = "Fatty"; - 对象通过引用传递,值永远不会被拷贝
- 原型
如果我们尝试去获取对象的某个属性值,且该对象没有此属性,那么javascript会尝试着从原型对象中获取属性值。如果那个原型对象也没有该属性,那么再从它的原型中寻找,依次类推,直到该过程最后到达终点Object.prototype
if(typeof Object.beget !== 'function')
{
Object.beget == function(o)
{
var F = function(){};
F.prototype = o;
return new F();
};
}
var another_obj = Object.beget(obj); - 反射
1.typeof 检测所有属性(包括原型属性)
typeof obj["first"] //string
hasOwnProperty 仅检测自己的属性,不会检测原型属性 - 属性和数组
属性:var obj = {"first":"Kevin","last":"Ge"}
数组:var obj = ["kevin","Ge"] - 用 for in 遍历属性(包括原型)
var name;
for(name in another_obj)
{
typeof another_obj[name] !== 'function'
{//do something ....}
} - 删除自有属性
自有属性是相对于原型属性而言,如果没有改变原型属性,仅引用原型属性;如果改变了原型属性,那么就会创建一个新的自有属性
another_obj.nickname = "new nickname";
delete another_obj.nickname;
//use the original nickname in prototype - 减少全局变量的污染//没有理解
var MYAPP = {};
MYAPP.obj = {"first":"Kevin","last":"Ge"}
Chapter 4: 函数
- 函数也是对象
因为函数是对象,所以它们可以像任何其他的值一样被使用。函数可以存放在变量,对象和数组中。函数可以被当做参数传递给其他函数,函数也可以再返回函数。而且,因为函数是对象,所以函数可以拥有方法。 - 函数参数
如果函数参数过多,超出的参数就会被忽略
如果函数参数过少,缺失的值就为undefined - 当一个函数被保存为对象的一个属性时,我们称它为一个方法。当一个方法被调用时,this被绑定到对象。var myObject ={value: 0,increment: function(inc){this.value += typeof inc === 'number'? inc:1;}};myObject.increment();alert(myObject.value);//1myObject.increment(2);alert(myObject.value);//3
myObject.double = function(){var helper = function()}
- 关于this
方法是可以使用this,但方法里面的函数就不能使用this,需要加个属性过渡一下myObject.double = function(){var that = this;var helper = function(){that.value = add(that.value,that.value);};helper();}myObject.double();alert(myObject.value);//6 3+3 - new构造器调用模式
如果在一个函数前面带上new来调用,那么将创建一个隐藏连接到该函数的prototype成员的新对象,同时this将会被绑定到那个新对象上。 - apply调用模式
apply方法接收两个参数。1:将被绑定给this的值 2:参数数组 - arguments数组
通过arguments数组可以访问所有函数被调用时传递给它的参数列表
var sum = function()
{
var i, sum =0;
for(i=0;i<arguments.length;i++)
{sum += arguments[i];}
return sum;
}
alert(sum(1,2,3,4));//10 - 给类型增加方法
Function.prototype增加方法,使得该方法对所有函数可用:
Function.prototype.method = function(name, func)
{
if(!this.prototype[name])
{
this.prototype[name] = func;
}
}
Number.method('integer',function(){return Math[this<0?'ceiling':'floor'](this);})
(-10/3).integer();
String.method('trim',function(){return this.replace(/^s+|\s+$/g,'');});
" neat ".trim(); - 闭包
函数可以访问它被创建时所处的上下文环境,这被称为闭包。