Javascript 笔记(3)----对象
构造函数
function Person() { //大写构造函数名的首字母以区别普通函数
this.name = 'lf';
}
var person = new Person();
person.name; //"lf";
接受参数的构造函数,个性化定制
function Person(age){
this.age = ge;
this.name = 'lf';
this.action = function() {
return "Hello world!" + "I'm" + this.name + "and I'm" + this.age + "old";
}
}
var p1 = new Person(20); //"Hello world!I'm lf and I'm 20 old";
若在创建新对象的时候忘记了new关键字会怎么样?
var p = Person(20);
typeof p; //undefined
因为没有加new关键字,就像调用普通函数一样调用Person()方法,注意,这时的this指向的是window对象.
constructor
当一个对象创建的时候,都有一个属性指向构造它的元.—-constructor,就像上面的例子:
p1.constructor; //Person(age)
若你想构造一个和p1大体功能相似的对象,但是又不知道它的原始构造函数时:
var p2 = new p1.constructor(80);
p2.name; //"lf"
instanceof操作符
测试一个对象是否是被特殊的构造函数创建
function F1() {};
var f = new F1();
var o = {};
f instanceof F1; //true
f instanceof Object; //false
o instanceof Object; //true
Functions that return objects:
除了像前面一样用构造函数和new新建一个对象之外,还可以像普通函数一样通过函数返回一个对象实现对象的创建.
function factory(name) {
return {
name : name;
};
}
var o = factory('one');
o.name; //"one"
o.constructor; // Object()
Passing Objects:
当你复制或则传递一个对象给函数时,你传递的是该对象的指向.他们都是指向该对象的内存空间,能直接改变原对象.
var original = { howmany: 1 };
var copy = original;
copy.howmany; //1
copy.howmany = 100; //100
original.howmany; // 100
同样的,对于一个作为函数参数传递的对象,也能在函数里面直接修改原对象.
Comparing Objects:
当比较两个对象时,只有当两个对象都指向同一片内存空间时,结果才会返回true,比较两个分开的对象.即使他们拥有相同的属性或方法,他们的结果都会返回false.
var fido = { breed: 'dog' };
var benji = { breed: 'dog' };
benji === fido; //false
benji == fido; //false
var mydog = benji;
mydog == benji; //true 这时因为两个对象指向的内存空间是一样的.
mydog == fido; //false
Built-in Objects:内置对象
当一个对象被创建的时候:
var o = {};
var o = new Object();
就已经继承了一些特有的方法:
o.constructor
o.toString()
o.valueOf() 返回对象o自己的值
var a = new Array(1,2,3,'four');
typeof a; // object
a.toString(); //"1,2,3,four";
a.valueOf(); //[1,2,3,"four"]
a.constructor; //Array()
Array()
push(),向数组尾追加新值
pop(),删除数组尾元素
sort(),排序数组.采用冒泡排序算法
join(),返回一个用传递参数连接所有数组元素的string.
var a = new Array(1,2,3);
a.join('|');
a; //1|2|3
slice(),两个参数,第一个是起始位置,第二个是结束位置.两个参数都是从0开始.返回截取的字符串.原数组并没有变.
splice(),截取+替换,前两个参数是截取范围.后面其他的参数是替换的内容
Function
length,返回函数参数的个数
function myfunction(a,b,c){ return true;}
myfunction.length; //3
caller,谁调用了这个函数.
function A() { return A.caller; }
function B() { return A; } //调用了A()
B(); //B()
若A在全局被调用,则A.caller = null.
toString(),这个方法返回函数体的全部代码.
call(),apply(),允许自己的对象从别的对象处借用方法,并且调用这个方法.这样呢给你充分的代码复用.
some_obj.someMethod.call(my_obj,'a','b','c'...);
call()方法能传递这样的参数,第一个参数是需要调用别的对象方法的对象名,后面的参数是是传递给这个方法的.这时原本在some_obj中,指向some_obj的this将会指向my_obj.注意,若cal后面不传参数或则传递了null.则this将只想全局,方法中涉及到的参数将会去全局中寻找.
some_obj.someMethod.apply(my_obj,['a','b','c'...]);
apply()与call()的区别仅在于传递的参数,apply需要传递一个数组形式的参数.
arguments
返回函数中传递的参数,arguments看起来像数组,但事实上它只是一个看起来像数组的对象,因为它同样拥有下标和length属性,但它并没有数组的slice或则sort方法.arguments拥有自己的NB的属性–callee.
callee property.
This contains a reference to the function being called. If you create a function that returns arguments.callee and you call this function, it will simply return a reference to itself.
function f() { return arguments.callee;}
f(); //f()
一个有趣的应用:让self-invoking function执行多次.
(
function(count){
if (count < 5) {
alert(count);
arguments.callee(++count);
}
}
)(1);
将会提示1,2,3,4
Boolean
一个对象,即使是空对象也是真的.
Number
toString(),接受参数,把数据转换成相应的进制.
String
length属性
这样创建的两个string是有区别的:
var obj = new String('world'); //typeof is Object
var primitive = 'Hello'; //typeof is string
特别地,一个空对象是true,但是一个空string却是false:
Boolean(""); //false
Boolean(new String("")); //true
toUpperCase()
toLowerCase()
charAt(),返回索引.
indexOf(),返回第一次匹配的位置.下标从0开始记.若传递第二个参数s.indexOf(‘a’,2)将会返回a第二次出现的位置//除了寻找单个的字符外,还可以查找一个短语或则句子.若找到则返回大于或等于0的位置,未找到则返回-1 ,故用if语句判断是否找到的时候应该是判断是否 != -1
lastIndexOf()返回最后一个匹配的位置
slice(),substring(),返回截取的片段,两个参数.起始和结束.区别在于:当传递[1,-1]这种区间时,slice()会截取整个字符串,而substring()则把[1,-1]当成[0,0];
split(),根据传递的分割符,把字符欻分割成为相应的数组.
concat(),把两个字符串接到一起.和 “+”的功能差不多.只是concat()不会改变原字符串,只是返回连接以后的新值
Math:属性都是大写的
Math.PI; //3.14....
Math.SQRT2; //1.4..开根号
Math.E
Math.LN2
Math.random();返回0-1的随机数.若别的范围:100*Math.random()+2
((max - min) * Math.random()) + min
Math.round();
Math.floor();
Math.ceil();
Math.pow(a,b);
Math.sqrt(a);
Date
var d = new Date(); //Fri Mar 29 2013 12:11:20 GMT+0800 (CST)
var d = Date(); //"Fri Mar 29 2013 12:13:24 GMT+0800 (CST)"
d.setMonth();
d.getMonth();
RegExp
test();正则匹配返回true或false
match(),返回一个匹配的数组
serch()返回第一次匹配的位置
replace(),替换匹配的内容
split(),接受正则的参数来分割字符串成数组
Error Objects
try{
//不确定是否会报错的内容;
} catch(e){
//若try的内容出错了,则执行这里的内容
} finally{
//再执行这里的东西
}