JavaScript学习笔记——对象基础

来源:互联网 发布:安卓7.0数据库编辑器 编辑:程序博客网 时间:2024/05/29 19:09

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("");//就会出现连接这两个单词。中间没有空格的字符串。


 

 

原创粉丝点击