JavaScript 构造器模式详解:从对象创建到原型共享

作者:拾光

时间:2026-10-30

浏览:665

本文深入解析 JavaScript 中的构造器模式,涵盖对象创建的两种主要方式:字面量与 new 关键字。详细演示了通过点语法、中括号及 ES5 方法赋值属性的技巧,并重点探讨利用 prototype 属性实现方法共享以优化内存使用,解决传统构造器模式的局限性。

文章目录

构造器模式概述

构造器(Constructor)是一种特殊方法,在内存已为该对象分配后,用于初始化新创建的对象。Object 构造器用于生成特定类型的对象,使其准备好使用。同时,构造器可以接收参数,以便在首次创建对象时设置成员属性和方法的初始值。

对象创建与属性赋值

在 JavaScript 中创建新对象通常有两种方式:第一种是对象字面量法,例如:

第二种是使用构造器的简洁写法:var newObj = new Object();。当 Object 构造器用于为特定值创建对象封装,或未传递任何值时,它会创建一个空对象并返回。

对象属性的赋值主要有以下几种方法:第一种是“点”语法。


 //设置属性
newObj.name = 'LanFeng';
//获取值
var user= newObj.name;

第二种是中括号语法。


 //设置属性
newObj["name"]= 'LanFeng';
//获取值
var user= newObj["name"];

第三种是使用 Object.defineProperty,该方法适用于 ECMAScript 5 及更高版本。


 //设置属性
Object.defineProperty(newObj,"name",{
  value:"LanFeng",
  writable:true,
  enumerable:true,
  configurable:true
})

第四种是使用 Object.defineProperties,用于一次性定义多个属性。


 //设置属性
 Object.defineProperties(newObj,{
   "someKey":{
    value:"Hello Js",
     writable:true
  },
  "anotherKey":{
    value:"Foo bar",
    writable:false
  }
})

构造器实现与局限性

JavaScript 本身不支持传统的类概念,但它提供了与对象配合使用的特殊 constructor 函数。通过在构造器前添加 new 关键字,可以指示 JavaScript 像使用构造器一样实例化一个新对象,且对象成员由该函数定义。在构造器内部,关键字 this 引用新创建的对象。回顾对象创建过程,基本的构造器示例如下:


function Car(model,year,miles){
  this.model = model;
  this.year = year;
  this.miles = miles;
  this.toString = function(){
  return this.model + "has done" + this.miles +"miles";
  }
}
//创建实例化对象

var civio = new Car("Honda Civio",2009,20000);

var mondeo= new Car("Ford Mondeo",2009,5000);

上述示例展示了简单的构造器模式,但存在一些问题。首先,这种方式使用继承变得困难;其次,像 toString() 这样的函数会为每个通过 Car 构造器创建的新对象单独定义,这并非最佳实践,因为此类函数应在所有 Car 类型的实例之间共享。

利用原型链优化

JavaScript 提供了一个 prototype 属性。当调用 JavaScript 构造器创建对象后,新对象将拥有构造器原型的所有属性。通过这种方式,可以创建多个对象并访问相同的原型,从而实现方法的共享。


function Car(model,year,miles){
  this.model = model;
  this.year = year;
  this.miles = miles;

}


//原型函数
Car.prototype.toString = function(){
  return this.model + "has done" + this.miles +"miles";
  }

//创建实例化对象

var civio = new Car("Honda Civio",2009,20000);
var mondeo= new Car("Ford Mondeo",2009,5000);
console.log(civio.toString())
console.log(mondeo.toString())

现在,toString() 的单一实例可以在所有 Car 对象之间共享,从而优化资源使用。

以上为本文的全部内容,希望对读者学习有所帮助,也欢迎大家继续支持本站。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章