前面我们提过对象的基本概述,对象的创建基本方法如下:
var obj={
name:"孙悟空",
age:18,
gender:"男",
sayName:function()
{
alert(this.name);
}
};
obj.sayName();
但是如果要创建大量的对象,这样写可实在是太慢了
所以下面来介绍搞效率的创建方法
工厂方式批量生产对象
通过该方法可以大批量的创建对象
function createPerson(name,age,gender)
{
//创建一个新的对象
var obj=new Object();
//添加属性
obj.name=name;
obj.age=age;
obj.gender=gender;
obj.sayName=function()
{
alert(this.name);
};
//将其返回
return obj;
}
var obj3=createPerson("saber",14,"女");
var obj2=createPerson("八戒",50,"男");
console.log(obj3);
console.log(obj2);
obj2.sayName();
obj3.sayName();
通过上述方式虽可以实现高效率生产对象,但是我们使用的构造函数都是Object,所以创建的对象都是object这个类型,就导致我们无法区分出多种不同类型的对象。
所以我们就用另一种方式
构造函数
构造函数就是普通函数,创建方式与普通的函数方式一样,不同的是构造函数习惯首字母大写,构造函数就是调用方式与普通函数不同,普通函数就是直接调用,而构造函数就需要new关键词来调用。
构造函数流程:
- 立刻创建一个新的对象。
- 将新建的对象设置为函数中this ,在构造函数中可以使用this来引入新建的对象。
- 逐行执行函数中的代码。
- 将新建的对象作为返回值返回。
创建一个Person类:
function Person(name,age,gender)
{
this.name=name;
this.age=age;
this.gender=gender;
this.sayName=function()
{
alert(this.name);
}
}
//通过构造函数创建对象
var per=new Person("孙悟空",18,"男");
var per2=new Person("猪八戒",25,"男");
console.log(per);
console.log(per2);
使用同一个构造函数创建的对象,我们称之为一类对象,也将构造函数称之为一个类,我们将通过一个构造函数创建的对象,称之为该类的实例,比如dog就是Dog类的实例。上边的per就是Person类的实例。
使用instanceof来检查一个对象是否属于一个类的实例
语法:对象 instanctof 构造函数
如果是就返回true,否则flase
console.log(dog instanceof Person);
console.log(dog instanceof Object);
//所有的对象和Object做检查时都会返回true
完善构造函数
之在Person构造函数中为每一个对象都添加了一个sayName方法,目前我们的方法是在构造函数中创建的。也就是构造函数每执行一次就会创建一个sayName方法,也就是所有的实例sayName方法都是唯一的。但这完全没必要,完全可以使对象共享一个方法,解决方法,将方法在全局作用域中定义。
其实可以这样理解,之前在构造函数中创建方法就像我们给每个学生配一个厕所,一旦学生多了,这样实现会很困难的(代码中就是影响效率),但是你厕所相对于每个学生来说功能是一样的,那么为什么我们不建一个公共厕所来解决这个问题。
当然会想到将函数在全局空间中定义
function Person(name,age,gender)
{
this.name=name;
this.age=age;
this.gender=gender;
this.sayHello=fun;
}
function fun()
{
alert("大家好,我是"+this.name);
}
但是将函数在全局空间中定义,污染了全局作用域的命名空间,而且也不安全。
所以我们可以通过原型对象来改良构造函数
function Person(name,age,gender)
{
this.name=name;
this.age=age;
this.gender=gender;
//添加一个方法,现在不用这样了
//this.sayHello=fun;
}
//使用原型对象,
Person.prototype.sayHello=function()
{
alert("大家好,我是"+this.name);
}
var per=new Person("渣渣辉",38,"男");
var per2=new Person("塔基八六亿",45,"男");
console.log(per2.sayHello());
console.log(per.sayHello());
这样在创建大量的对象时就会大幅代码的执行效率了。
原型对象的详解