JavaScript面向对象编程:工厂模式与构造函数详解

作者:半夏时间:2026-10-29 10:04:59浏览:653

本文基于《JavaScript高级程序设计》解析面向对象核心概念。首先介绍工厂模式解决重复实例化但无法识别对象类型的问题,随后深入讲解构造函数模式。通过对比两者在对象创建、this指向、返回值及new运算符使用上的差异,阐明构造函数如何解决对象识别问题,并结合代码示例说明实例化与类型判断。

JavaScript面向对象概述

本文核心内容参考自《JavaScript高级程序设计》中关于面向对象与原型的章节。

工厂模式及其局限性

1、工厂模式

在ECMAScript中,可以利用工厂模式来创建对象。


//工厂模式
function createObject(name, age) {
  var obj = new Object();                  //创建对象
  obj.name = name;                      //添加属性
  obj.age = age;
  obj.run = function () {                    //添加方法
    return this.name + this.age + '运行中...';
  };
  return obj;                            //返回对象引用
};
var obj1 = createObject('Lee', 100);          //创建第一个对象
var obj2 = createObject('Jack', 200);          //创建第二个对象
//alert(obj1.run());                          //打印第一个对象实例的run()方法
//alert(obj2.run());                          //打印第二个对象实例的run()方法

//alert(typeof obj1);
//alert(typeof obj2);
alert(obj1 instanceof Object); //true
alert(obj2 instanceof Object); //true

虽然工厂模式解决了重复实例化对象的问题,但它无法解决对象识别问题,因为所有通过该模式创建的对象类型均被识别为Object。为了解决对象识别问题,我们需要采用下文介绍的构造函数方式。

构造函数模式详解

2、构造函数


//构造函数创建
function Person(name,age){  //所有构造函数对象都是Object
  this.name=name;
  this.age=age;
  this.run=function(){
    return this.name+this.age+"ing...";
  };
};
var person1=new Person('zhu1',100);
var person2=new Person('zhu2',200);
alert(person1.run());
alert(person2.run());

alert(person1 instanceof Object); //ture
alert(typeof person2);         //Person
alert(person2 instanceof Person);  // true
var person3=new Object();
Person.call(person3,'zhu3',300);//对象冒充,person3是Object类型,冒充Person类型
alert(person3.run()); 

在构造函数中,this关键字代表当前作用域内对象的引用。若在全局范围内使用,this指向window对象;若在构造函数体内使用,则指向当前构造函数所声明的新对象。

构造函数方法不仅解决了重复实例化的问题,还解决了对象识别问题。与工厂模式相比,两者的主要区别如下:

1. 构造函数没有显式地创建对象(即不使用new Object());

2. 直接将属性和方法的值赋值给this;

3. 没有return语句;

4. 使用构造函数创建对象时,必须使用new运算符。

以上即为本文关于JavaScript面向对象与原型的全部内容,希望对大家有所帮助。

作者最新文章