文章目录
JavaScript类的实现-工厂模式
JavaScript类的实现-工厂模式
1.定义
在JavaScript语言中,它没有像面向对象的语言一样明确类(class)的定义。我们只有通过“模拟”的方法来实现类。
通过类来实例化一个或几个对象,这个过程就好似工厂生产多件模具。在软件领域有一种广为人知的设计模式叫工厂模式,它用于抽象创建具体对象的过程。例如,我们想创建几部手机对象,那么可以抽象一个工厂对象,通过这个工厂对象生产手机。
2.语法
主要用Object的原生函数和类的定义实现对象
function 函数名([参数···]){
var 类名=new Object();
类名.属性=参数;
类名.属性1=参数;
类名.函数名=function([参数···]){【return 元素;】}
return 类名;
}
举个例子
function createPerson(name,age)
{
var Person = new Object();
Person.name = name;
Person.age = age;
}
function createPerson(name,age)
{
var Person = new Object();
Person.name = name;
Person.age = age;
return Person;
}
var PersonA = createPerson("ZhangSan","18");
var PersonB = createPerson("LiSi","18");
3.缺点
厂模式虽然解决了创建多个相似对象的问题,但你会发现由于
其创建对象都是使用Object的原生构造函数来完成的,生成
的实例之间没有内在的联系。
如下边的例子。可以看出从BicycleShop ,生成出的对象bicycle居然不是BicycleShop的实例。
注意:
instanceof是运算符,来判断一个变量是否是某个对象的实
例。
function BicycleShop() {
var bicycle = new Object();
return bicycle;
};
var bicycle = BicycleShop();
alert( bicycle instanceof BicycleShop);
//instanceof 用于判断一个变量是否某个对象的实例
4.优化为构造函数模式
为了解决类中生成的对象不是自身实例这个问题,我们可以使用
JavaScript中构造函数的模式。
所谓"构造函数",其实就是一个普通函数,但是内部使用了this变量
如果对构造函数使用new运算符,就能生成实例,并且this变量会绑定在实例对象上。(这里的this就指通过这个构造函数生成一个 新对象,this很重要我们会在接下来中详细讲述)
1)直接将属性和方法赋值给了this对象,在函数内部的this对象就是指它本身
function Person(name, age){
this.name = name ;
this.age = age;
this . sayName = function(){
document . write (this . name) ;
};
}
2)在函数后面使用new创建对象
var personA三new Person("ZhangSan" ,"18");
3)并在personA后面调用方法
personA. sayName();
4)检查下personA是否是Person的实例
alert(personA instanceof Person);
举个例子
//请在此完成代码
function Person(name,age){
this.name=name;
this.age=age;
this.sayName=function(){
document.write(this.name);
};
}
var personA = new Person("ZhangSan","18");
personA.sayName();
alert(personA instanceof Person);
5.构造函数的缺点
构造函数模式很好用,但是存在浪费内存的问题,例如在上节的person对象上都有一个相同的sayName方法。每一次生成一个person对象,都必须重新创建一遍sayName,多占用一些内存。这样既不环保,也缺乏效率。
1.构造函数优化
构造函数模式很好用,但是存在浪费内存的问题,例如在上节的person对象上都有一个相同的sayName方法。每一次生成一个person对象,都必须重新创建一遍sayName,多占用一些内存。这样既不环保,也缺乏效率。
解决方案:添加一个全局的公用的函数
举一个例子
请在指定位置完成如下代码:
1)在全局添加一个sayName函数
function sayName(){
document . wr ite(this .name);
}
2)再在Person类中将sayName () 指向外部的sayName ()
this. sayName = sayName;
6.优化工厂模式继续优化
前言
构造函数的虽然优化过了,但是全局的函数越来越多,对封装不利
使用prototype优化构造函数
Javascript规定, 每一个构造函数都有一个prototype属性,指向
另一个对象。这个对象的所有属性和方法,都会被构造函数的实
例继承。这意味着,我们可以把那些不变的属性和方法,直接定
义在prototype对象上。请将Person类中的sayName函数改为如
下代码,并调试观察与之前结果是否-致。
通过构造函数实例化对象后,定义在prototype对象上的方法能
够被重写
举个例子
function Person(name, age) {
this.name = name;
this.age = age;
Person.prototype.sayName = function() {
//请在此修改代码
document.write(this.name);
};
}