对象是什么
从JavaScript定义上讲对象是无序属性的集合,其属性可以包含基本值、对象或函数。也就是说对象是一组没有特定顺序的属性,每个属性会映射到一个值上,是一组键值对,值可以是数据或对象。
最简单的对象
JavaScript的一对花括号{}就可以定义一个对象,这样的写法实际上和调用Object的构造函数一样
var obj={}; var obj2=new Object();
这样构建出来的对象仅仅包含一个指向Object的prototype的指针,可以使用一些valueOf、hasQwnProperty等方法,没有多大实际作用,自定义对象嘛总要有一些自定义的属性、方法神马的。
var obj={}; obj.a=0; obj.fn=function(){ alert(this); } var obj2={ a:0, fn:function(){ alert(this); } }
可以在定义完对象后通过”.”为其添加属性和方法,也可以使用字面量赋值方法在定义对象的时候为其添加属性和方法,这样创建的对象,其方法和属性可以直接使用对象引用,类似于类的静态变量和静态函数,这样创建对象有一个明显缺陷——在定义大量对象的时候很费力,要一遍遍的写几乎是重复的代码。
抽象一下
既然是重复代码就可以抽象出来,用函数来做这些重复工作,在创建对象的时候调用一个专门创建对象的方法,对于不同的属性值只需要传入不同参数即可。
function createObj(a,fn){ var obj={}; obj.a=a; obj.fn=fn; return obj; } var obj=createObj(2,function(){ alert(this.a); });
这里先定义o为一个空的对象,然后为o设置了一堆属性。其实也可以直接给o属性的嘛,所以如果这样写也是ok的。
function createPerson(name,age,job){ var o = {}; o.name = name; o.age = age; o.job = job; o.sayName = function(){ alert(this.name); }; return o; } var tanya = createPerson("tanya","30","female"); var ansel = createPerson("ansel","30","male"); tanya.sayName(); ansel.sayName();
还有一种办法是利用无敌的this,因为this就表示当前运行时的对象,将构造函数this的作用域指向新对象,将当前运行对象的属性和方法都赋给新对象,这样对象模式称为构造函数模式
function Person(name,age,job){ this.name = name; this.age = age; this.job = job; this.sayName = function(){ alert(this.name); }; } var tanya = new Person("tanya","30","female"); var ansel = new Person("ansel","30","male"); tanya.sayName(); ansel.sayName();