JavaScript 对象创建模式详解:工厂、构造函数与原型

作者:拾光时间:2026-10-28 18:27:32浏览:416

本文深入解析 JavaScript 中创建对象的五种核心模式:工厂方式、构造函数方式、原型方式、混合构造函数/原型方式以及动态混合方式。通过具体代码示例,对比分析各模式在属性初始化、方法复用及资源消耗上的差异,帮助开发者根据实际需求选择最优的面向对象设计策略。

每个函数对象都具备一个 length 属性,该属性用于指示该函数期望接收的参数数量。

相关代码示例如下:

<html>
<head>
<script type="text/javascript">
var add =function(num1,num2,num3){
alert(num1+num2+num3);
} 
alert(add.length);
</script>
</head>
<body>
</body>
</html>

JavaScript 对象创建模式概述

接下来探讨 JavaScript 中面向对象的几种创建方式。

我们的目标是:

构建一个 order 对象。该对象需包含三个属性:日期、金额和提交人;同时包含一个方法,用于显示格式化的字符串:“XX在XXXX-XX-XX 提交了额度为:XXXX元的订单”。

工厂方式

一、工厂方式

具体实现代码如下:

<script type=text/javascript>
              /*
工厂方式的核心在于通过函数返回对象,调用时无需使用 new 关键字生成新对象。
              */
function createOrder()//也可以构建带参数的工厂方法,根据传入的参数初始化对象数据.
              {
var order = new Object();
order.Date = "1990-1-1";
order.Price = "3200";
order.Name = "Vince Keny";
order.Show = function()//将show方法放在工厂中,则分别为每个实例创造一个Show方法.浪费资源是此模式的弊端.
                       {
alert(this.Name + " 在 " + this.Date + " 提交了额度为 " + this.Price + " 元的订单.")
                       }
return order;
              }
//使用工厂模式返回对象:
var order = createOrder();
//也可以这样使用,把工厂模式改造成"伪构造函数",因为在工厂中使用了new,所以创建对象时的new运算符将被忽律.
var order2 = new createOrder();
order.Show();
order2.Show();
</script>

构造函数方式

二、构造函数方式

相关代码如下:

/*
构造函数方式在方法声明上与工厂方式类似,同样存在方法重复创建的问题,因此方法也可以提取出来。主要区别在于属性声明使用 this 关键字。
此外,必须使用 new 运算符来生成实例。
*/
function Order()
{
this.Date = "1990-1-1";
this.Price = "3200";
this.Name = "Vince Keny";
this.Show = function()
         {
alert(this.Name + " 在 " + this.Date + " 提交了额度为 " + this.Price + " 元的订单.")
         }
}
 
var order = new Order();
order.Show();

原型方式

三、原型方式

实现代码如下:

/*
原型方式利用 prototype 属性进行定义。
*/
function Order()
{}
 
Order.prototype.Date = "1990-1-1";
Order.prototype.Price = "3200";
Order.prototype.Name = "Vince Keny";
Order.prototype.Show = function()
     {
alert(this.Name + " 在 " + this.Date + " 提交了额度为 " + this.Price + " 元的订单.")
     }
var order = new Order();
order.Show();

混合构造函数/原型方式

四、混合构造函数/原型方式

代码示例如下:

/*
混合构造函数/原型方式结合了两者的优点:使用构造函数初始化属性字段,使用原型方式构造方法。
*/
function Order()
{
this.Date = "1990-1-1";
this.Price = "3200";
this.Name = "Vince Keny";
}
Order.prototype.Show = function().
{
alert(this.Name + " 在 " + this.Date + " 提交了额度为 " + this.Price + " 元的订单.")
}
var order = new Order();
order.Show();

动态混合方式

五、动态混合方式

具体代码如下:

/*
动态混合方式与常规混合方式的区别在于方法的声明位置。该方法被声明在构造函数内部,这种结构更符合面向对象的设计原则。
*/
function Order()
{
this.Date = "1990-1-1";
this.Price = "3200";
this.Name = "Vince Keny";
    
if(typeof Order._initialized == "undefined")
     {
Order.prototype.Show = function().
                       {
alert(this.Name + " 在 " + this.Date + " 提交了额度为 " + this.Price + " 元的订单.")
                       };
Order._initialized = true;
     }
}
function Car(sColor,iDoors){
 var oTempCar = new Object;
 oTempCar.color = sColor;
 oTempCar.doors = iDooes;
 oTempCar.showColor = function (){
 alert(this.color)
 };
 return oTempCar;
 }
 var oCar1 = new Car("red",4);
 var oCar2 = new Car("blue",3);
 oCar1.showColor(); //outputs "red"
 oCar2.showColor(); //outputs "blue"
作者最新文章