天天看点

javaScript面向对象-2

文章目录

JavaScript类的实现-工厂模式

  • ​​1.定义​​
  • ​​2.语法​​
  • ​​3.缺点​​
  • ​​4.优化为构造函数模式​​
  • ​​1)直接将属性和方法赋值给了this对象,在函数内部的this对象就是指它本身​​
  • ​​2)在函数后面使用new创建对象​​
  • ​​3)并在personA后面调用方法​​
  • ​​4)检查下personA是否是Person的实例​​
  • ​​5.构造函数的缺点​​
  • ​​1.构造函数优化​​
  • ​​解决方案:添加一个全局的公用的函数​​
  • ​​6.优化工厂模式继续优化​​
  • ​​前言​​
  • ​​使用prototype优化构造函数​​

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函数改为如

下代码,并调试观察与之前结果是否-致。

function Person(name, age) {
  this.name = name;
  this.age = age;
  Person.prototype.sayName = function() {
        //请在此修改代码
    document.write(this.name);
  };
}