您的位置:首页 > Web前端 > JavaScript

JavaScript学习笔记——对象基础

2013-07-10 10:49 711 查看
1. 对象定义:属性的无序集合,每个属性存放一个原始值、对象或者函数。

2.面向对象语言的要求

封装--把相关的信息(无论数据或方法)存储在对象中的能力。

聚集--把一个对象存储在另一个对象内的能力。

继承--由另一个类(或多个类)得来类的属性和方法的能力。

多态--编写能以多种方法运行的函数或方法的能力。

ECMAScript支持这些要求,所示可以被看做是面向对象的。

3.声明和实例化

new 后面跟要实例化的类的名字创建。

4.对象销毁

ECMAScript有无用存储单元收集程序,不必专门的销毁对象来释放内存。

把所有的引用对象都设置为null,可以强制性的废除对象。

5.晚绑定

晚绑定:编译器或解释程序在运行前,不知道对象的类型。使用晚绑定,无需检查对象的类型,检查对象是否支持特性和方法即可。

ECMAScript中的大量变量都使用晚绑定。

6Array类

var aValues = new Array();

也可以定义大小Array(20);

输入值aValues[0] = "red";

或者直接创建 Array("red", "green", "blue");

1》数组长度aValues.length

数组最多可以存放4294967295项。只要把相应的项放在这个数字之内,就可以,之间用null填充。

2》也可以通过以下方法创建array数组。

var a = ["red", "green", "blue"];最终和使用Array是一样的。

3》数组转换成字符串,返回字符串:

1>a.toString()或者是a.valueOf()返回一个数组元素之间插入一个“,”分割。

2>a.join("-String-");返回一个在每一个数组元素之间插入-String-字符。

4》字符串返回数组

var sColors = “red,green,blue”;

var aColors = sColors.split(",");返回Array数组。

5》也可以把一个字符串返回单个字符

var a = “green”;

var b = a.split();

a.toString()返回单个字符,“g” “r” “e” “e” “n”。

6》数组字符串链接concat(),slice()

1>var a = new Array("red", "green", "blue");

var b = a.concat("ye", "pur");//把字符串添加到数组末尾中

alert(b.toString());//red,green,blue,ye,pur

alert()a.toString());//red,green,blue

2>var a = new Array("red", "green", "blue", "ye", "pur");

var c = a.slice(1);//1表示其实位置 最后是"green", "blue", "ye", "pur"。green是位置为1

var d = a.slice(1, 4);//1.表示被裁减的数组的起始位置,4表示结束位置。"green", "blue", "ye"。

7》 push()在Array末尾添加一项和pop()删除最后一个数组项,最后一项作为返回值。

8》 shift()删除数组中的第一个项,并作为返回值/unshift(“AA”)把AA作为第一项,所有的向后移一项。

9》 Array是一个栈,先进后出(LIFO)

通过array的push()和shift()两个函数可以制造出一个队列(get或者出对),后进后出(LILO)。

10》 排序sort()和reverse()

1>reverse()颠倒数组的顺序。

2>sort()对数组内是字符串的正序排列。

11》splice()在数组中间插入项。

1>arr.splice(0, 2);//删除0位置开始的2项

2>arr.splice(2, 0, "red", "green");//在2的位置处添加两项"red", "green"内容。如果第二个参数为几表示删除几个数组项。

7.Date类

1》parse()接受字符串为参数,把字符串显示成日期值。和UTC()必须声明年和月,其他值可选。

var d = new Date(Date.UTC(2004, 1, 5, 13, 5));//表示2004年1月5号下午1点05分。

8.内置对象 Global 和Math

Global对象

在ECMAScript中不存在独立的函数,函数必须都必须是某个对象的方法。

1>encodeURI()//表示处理完整的URI,不对URI中的特殊字符进行编码,如冒号、前斜杠、问号、英镑符号可以对空格编码。

2>encodeURIComponent()//表示处理片段的URI,对发现的所有非标准字符(数字和字母字符)进行编码。

3>decodeURI()与encodeURI()对应,反解码回来

4>decodeURIComponent()与encodeURIComponent()对应,反解码回来。

URI的上述四个方法代替BOM的escape()和unescape(),URI方法更可取,他会对所有的Unicode符号编码,而BOM只会对ASCII正确解码。

eval()接受一个参数,函数把他的参数解释为ECMAScript语句。

Golbal属性

所有本地对象的构造函数也是Golbal对象的属性。

undefined/NaN/Infinity/Object/Array/Function/Boolean/String/Number/Date/RegExp等。

Math对象

Math属性

E/LN10/LN2/LOG10E/LOG2E/PI/SQRT1_2/SQRT2

1>min()和max()判断一个数组中最小和最大值,可接受任意多的参数。

var iMax = Math.max(3, 34, 45, 12);

alert(iMax);//45

2>abs()返回一个数的绝对值。

3>ceil()向上舍入函数。

4>floor()向下舍入函数。

5>round()四舍五入舍入函数。

指数有关的函数exp()把特定的一个数字提到一定的幂,返回一个升幂后的数。

log()返回判断需要多少次指数才能等于特定的值。

pow(2, 10) 第一参数是基数,第二个是升到的幂。

var iNum = Math.log(Math.exp(10));//表示exp(10)把E升到10幂的值A,之后使用log()判断升到A这个值E需要升10次幂,即iNum的值为10。

6>random()表示0-1之间的随机数。



9.ECMAScript中的所有对象的属性和方法都是公用的。而且只存在一种作用域:公有作用域。

"静态作用域定义的属性和方法任何时候都能从一个位置访问。"??

10.关键字this

this总是指向该方法的对象。使用this可以是一个函数被多次使用,不用考虑变量名。

11.工厂函数,一个创建并返回一个特定对象的函数。下面就是一个工厂函数,返回一个对象,创建不同的对象,属性是一样的。

function creator() {

var oTempCar = new Object;

oTempCar.color = "red";

oTempCar.doors = 4;

oTempCar.mpg = 23;

oTempCar.showColor = function() {

alert(this.color);

};

return oTempCar;

}

var oCar1 = creator();

var oCar2 = creator();

//也可以通过传送参数,和C++函数一样,修改他的值.

function showColor() {

alert(this.color);

}//把showColor在工厂函数外定义,这样的好处是防止每次定义都要从新定义同一个函数

function creator(sColor, iDoors, iMpg) {

var oTempCar = new Object;

oTempCar.color = sColor;

oTempCar.doors = iDoors;

oTempCar.mpg = iMpg;

oTempCar.showColor = showColor;

return oTempCar;

}

var oCar1 = creator("red", 4, 23);

var oCar2 = creator("blue", 3, 25);

oCar1.showColor();//red

oCar2.showColor();//blue



12.构造函数:很像工厂函数,但是有一点是,构造函数不在函数内部创建对象,但是为每一个对象独立的创建所有的属性和函数。

13.原型方式

prototype 属性,每个构造函数都有这个属性,为已有的任何类定义新的方法。

1》例如:Number 这个类的toString()方法是传入一个16表示输出16进制的字符串,我们可以对他更改:

Number.prototype.toHexString() = function() {

return this.toString(16);

};//实现原理一样,但是Number却有一个不同的函数toHexString().

2》可以重新定义已有的函数。例如:

Function.prototype.toString() {

return "Function code Hidden";

};//原来的toString被重新定义,已经表示废弃了,被回收单元回收。

//要是在用原来的函数怎么办?

//存储原来函数的指针,之后可以在次调用它。

Function.prototype.originalToString = Function.prototype.toString;

Function.prototype.toString = function() {

if (this.originalToString().length > 100) {//检查函数源代码的长度是否大于100。

return "too long";

} else {

return this.originalToString();

}

};

function Car() { //类名Car空的构造函数

};

Car.prototype.color = "red";//类的所有属性和函数都被赋予prototype属性。表示Car有属性color,值为red。

Car.prototype.arr = new Array("M", "S");//Car添加一个arr数组属性,他是指向Array的一个指针。

var oCar1 = new Car();//原型所有的属性都被赋予给要创建的对象oCar1和oCar2

var oCar2 = new Car();

alert(oCar1 instanceof Car);//如果oCar1是Car的对象则返回true,instanceof是一个运算符,检查给定变量指向的对象类型。

oCar1.arr.push("Q");//Car两个实例都指向同一个数组。这意味着在oCar1.arr中添加的“Q”,在OCar2.arr中也能看到。

14.以上总结出 1.不能通过给构造函数传递参数初始化属性值。

2.属性指向对象时会出现问题,如上Array问题,函数往往就会正确。



15.混合的构造函数/原型方式

联合使用构造函数和原型方式,就像用其他程序设计语言一样创建对象。

使用构造函数定义对象的所有非函数属性,用原型的方式定义对象的函数属性。

//每一个对象的函数只创建一次,每个对象都具有自己的对象属性实例(综合上面的13和14),防止了内存浪费。

16.var str = "hello";

str += "world";//这种操作很耗费资源.创建world、创建存储连接结果、str原内容复制到结果中,在复制world到结果中,在更新str指向结果。

//可以使用Array的join()函数代替。

var a = new Array();

a[0] = "hello";

a[1] = "world";

var str = a.join("");//就会出现连接这两个单词。中间没有空格的字符串。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: