js学习笔记(七)对象
1、对象的创建
通过new关键字,如 var a=new Object(); //创建了一个空对象
通过对象直接量,如 var a={}; //同样是创建了一个空对象
通过对象直接量创建时还可以初始化对象,如 var a={x:100,y:”hello”}
对象的属性可以动态创建或添加,如 a.z=10000 //给对象a创建了一个新属性z
2、构造函数
构造函数可以理解为其他编程语言中的类,在实例化这个类时,要使用new运算符。
function Rectangle(w,h){
this.width=w; //类的属性,this指代的是实例化时的那个具体对象
this.height=h;
this.area=function(){return this.width*this.height} //类的方法
}
var a=new Rectangle(2,3); //实例化一个对象,括号中的参数可以初始化这个对象
var b=new Rectangle(4,6); //实例化另一个对象,用的是同一个类(也就是构造函数)
3、对象的方法
方法其实就是一个函数,区别在于方法可以使用this关键字,而普通函数一般不使用。
在这里的this关键字指代的是调用这个方法的对象(当然前提是这个对象有这个方法),因此,可以理解为函数中(不管是方法函数还是普通函数)一旦有this关键字,那么它指代的就是调用这个函数的对象。其实我们可以把普通函数看成是windows全局对象的方法,因此,作为普通函数运行时(即不是某个对象(windows对象除外)的方法)期中的this代表的就是windows对象。
4、原型对象和继承
每一个对象都有原型对象,对象会继承其原型对象的所有属性或方法。对象原型是由构造函数定义的。对象的原型对象用 a.prototype来引用(a是一个构造函数)
当在读对象a的某个属性时,系统会首先检查a有没有定义这个属性,如果没有则检查其原型(即a.prototype)中有没有定义这个属性。当改变a对象中没有定义而其原型中定义了的某个属性时(如a.x中的x属性是a对象的原型中定义的,a中并没有直接定义),如果改变a.x的值,并不会影响到其原型中的x属性的值(因为如果原型中的值一旦改变,则其影响的就可能会是很多的对象了,而不仅仅是当前这一对象),所以这时系统会为a对象自动添加一个x的属性(就相当于覆盖掉了其原型对象中的x属性的值)。
即使属性在被创建之后才添加到它的原型对象中,对象也能够继承这些属性。
假设我们定义了一个构造函数a(),那么它的原型对象就是a.prototype,我们可以为他添加属性或方法,比如a.prototype.x=10000,则所有用构造函数a实例化的对象都可以继承到x这个属性。
实际上构造函数和对象原型是模拟了其他编程语言中的类和继承
5、原型和内部类
不只是用户定义的类具有原型对象,像String、Date这样的内部类同样具有原型对象,你也可以给它们赋值,例如下面的代码定义了一个新方法,它适用于所有String对象。
String.prototype.a=function(){…} //为String的原型对象定义了一个方法
var m=”hello”; //创建一个字符串
m.a(); //该字符串继承了a()方法
6、命名类(在js中即为构造函数)时以大写字母开头,实例化一个类对象时以小写字母开头。
7、作为关联数组的对象
对象的属性不仅可以用点运算符来引用,也可以以数组的形式来引用,如下两个是等价的:
a.x
a[“x”]
以数组的形式来引用对象的属性更加灵活,因为[]中的属性名是一个字符串类型,所以可以用一个变量来代替,也就是说可以通过改变变量的值动态的引用不同的对象属性
8、对象的属性和方法
每个对象都有constructor属性,用来表示实例化该对象的构造函数,例如,构造函数Complex()创建了一个对象o,那么属性o.constructor表示的就是Complex
对象的toString()方法返回的是一个字符串,该字符串代表了调用它的对象的类型或值,当需要把一个对象转化成字符串时,就会调用这个方法。不同的对象用toString()返回的内容不同,如数组得到的是一个数组元素列表,函数得到的是该函数的原代码。