本文深入解析 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 对象之间共享,从而优化资源使用。
以上为本文的全部内容,希望对读者学习有所帮助,也欢迎大家继续支持本站。