javascript是一种“基于prototype的面向对象语言“,与java有非常大的区别,无法通过类来创建对象。那么,既然是面象对象的,如何来创建对象呢?
1、构造函数是一种特殊的函数,主要用来初始化对象,即为对象成员变量赋初始值,它总与new一起使用。我们可以把对象中一些公共的属性和
方法抽取出来,然后封装到这个函数里面
在JS中,使用构造函数时要注意以下两点:
1、构造函数用于创建某一类对象,其首字母要大写
2、构造函数要和new一起使用才有意义
new在执行时会做四件事情:
1)在内存中创建一个新的空对象
2)让this指向这个新的对象。
3)执行构造函数里面的代码,给这个新对象添加属性和方达。
4)返回这个新对象(所以构造函数里面不需要return).
2、构造函数原型prototype
构造函数通过原型分配的函数是所有对象所共享的。
javascript规定,每一个构造函数都有一个prototype属性,指向另一个对象。注意这个prototype就是一个对象,这个对象
的所有属性方法,都会被构造哈桑农户所拥有。
我们可以把那些公用的方法,直接定义在prototype对象上,这样所有对象的实例就可以共享这些方法。
JavaScript中创建对象的方法如下:
一:使用new关键字调用构造器创建对象(常用);
在JavaScript中,所有的函数名可以看成一个类名;
函数名和其参数可以看成一个构造器用于构造对象;
使用构造函数模式创建对象的几点注意事项:
(1):没有明显的创建对象
(2):直接将属性和方法赋给this对象
(3):没有return语句
(4):创建Student实例的时候,必须要使用new操作符;
function Student(name,age){ this.name=name;//this是当前对象的引用; this.age=age; } var s1=new Student();//没有传入参数,函数里面的name,age是undefine var s2=new Student("wangshicheng",20); document.write(s1.name+s1.age);//都是undefine; document.write(s2.name+s2.age);//都是传入实参的值;
二:使用Object直接创建对象
var myObj=new Object();//使用Object类创建一个空的对象 myObj.name="wangshihcheng"; myObj.age=20; myObj.infor=function(){ document.write("名字:"+this.name);//this.的指向问题 document.write("年龄:"+this.age); } myObj.infor();//调用创建的对象里面的方法;
三:使用代码块(JSON)创建对象的语法(最常用)
//object={属性名1:属性值1,属性名2:属性值2,.....}
//注意JOSN格式中属性名要加双引号;
var p={ "name":"wangsch", "gender":"man", "age":40, "son":[ { "name":"son1", "age":2 }, { "name":"son2", "age":5 } ], "infor":function(){ document.write("父亲的姓名:"+this.name+",父亲的年龄:"+this.age+"<br>"); for( var child in this.son ){ document.write("儿子的姓名:"+this.son[child].name+",儿子的年龄:"+this.son[child].age+"<br>"); } } } p.infor();//调用对象p中的infor方法
四:原型模式创建对象
在JavaScript中,每个函数都有一个prototype属性,它是一个指针,指向一个对象,叫做
原型对象,原型对象包含了可以由特定类型的所有实例对象共享的属性和方法;
另外,这个对象有一个自带的属性constructor,指向创建对象的构造方法;
当我们使用原型模式时可以使所有的实例共享原型对象的属性和方法,
从而我们不必要早构造函数中定义对象的实例的信息;
function Student(){ } Student.prototype.name="wang"; Student.prototype.sex="man"; Student.prototype.class="5"; Student.prototype.sayName=function(){ console.log(this.name); } var s1=new Student(); s1.sayName();//wang var s2=new Student(); s2.sayName();//wang s2.name="shicheng"; s2.sayName();//shicheng
当我们读取某个对象的属性时,都会执行一次搜索,搜索首先从对象实例本身开始,
如果在实例中找到了这个属性,则搜索结束,返回属性的值;
若实例上没有找到,则继续向对象的原型对象上面延申,搜索对象的原型对象,若在原型上面
找到这个属性,则返回原型上面属性对应的值,若没有找到,则返回undefine;
因此,可以看出,实例对象属性会覆盖原型对象上面的属性;
五:组合使用构造函数和原型模式
构造函数用于定义实例的属性,原型模式则用于定义方法和共享的属性;
function Student(name,sex,grade){ this.name=name; this.sex=sex; this.grade=grade; } Student.prototype.sayName=function(){ console.log(this.name); } Student.prototype.school="nongda";
这种混合模式可以支持想构造函数传入参数,还极大的节约了内存。