javaScript面向对象-2

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);
	};
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码浪人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值