JavaScript创建对象的五种方式详解
本文详细介绍JavaScript中创建对象的五种常见方式。从直观的直接创建和字面量,到解决代码冗余的工厂模式,再到优化内存与类型识别的构造函数及原型模式,逐一解析其优缺点与适用场景,帮助开发者根据实际需求选择最佳方案。
JavaScript面向对象基础
JavaScript是一种基于对象的语言,开发者可以运用面向对象的思想来模拟Java或C++等纯面向对象语言的特性。
面向过程开发关注的是解决问题的具体步骤,而面向对象开发则聚焦于解决问题所需的对象(包括内容与角色),随后依据业务逻辑按特定规则调用相关方法。
对象主要分为系统对象和自定义对象两类。系统对象可通过调用内置构造函数创建,例如Array或Date;而自定义对象则需由开发者自行构建,无法直接利用系统函数生成。
JavaScript创建对象的方法
在JavaScript中,创建对象有多种实现路径。
第一种方式是直接创建对象。
直接创建对象
//直接创建
//JS创建对象
//1:创建空对象
var person1 = new Object();
//2:将该对象所需要的属性、方法加进去
person1.name ="ailer" ;
console .log(person1.name);
person1.gender = "male";
//3:该对象添加的方法|(函数)
person1. manager= function (){
console .log("Ailer is my English name" );
}
//4:调用对象方法:对象.方法名();
person1.manager();
//函数|方法?函数属于对象时,该函数属于这个对象下的方法;通过方法名来调用该函数;
//变量|属性 ?当变量属于某一个对象时候, 该变量就是这个对象下的方法。通过属性名来调用变量。
//增
person1.age ="6" ;
//改
person1.name ="lemon" ;
//查
console .log(person1.name);
//删
delete person1.age;
console .log(person1.age);==> undefined
//引用类型,存储的是地址
//基本类型:存储的是值 标志位
/* var arr1 = [1,2,3,4]
var arr2 = [5, 6, 7,9];
var arr2 = arr1;//
arr2[0]=10;//更改arr2里面的值,arr1也更改
alert(arr1[0]);//====>10 引用类型*/
var per2 = new Object();
per2.name = "Relia";
per2.age = "18";
per2.gender = "femal";
per2.hobby = "lemons";
//1:通过.(点语法)访问属性
//2:通过[](方括号)访问对象的属性;方括号中必须是属性字符串或保存属性字符串的变量|遍历属性的时候才使用方括号
var n = "name"
//console.log(per2["name"]);//双引号
console .log(per2[n]);
for ( var property in per2) {
// console.log(per2[property]);
}
这种方式虽然直观易懂,但在需要创建多个相似对象时,会导致代码大量冗余。
第二种方式是利用函数创建,即采用工厂模式。
为了解决声明多个相似对象时产生的代码重复问题,可以使用工厂模式。该方法旨在消除实例化对象时的大量重复代码。
工厂模式创建
//定义构造函数
function createPerson ( name, age) {
//创建一个新的空对象
var person = new Object;
//添加属性|方法
person.name = name;
person.age = age;
person. manager = function() {
console .log("ai" );
}
//返回
return person;
}
var per1 = createPerson( "ailer", 12 );
console .log(per1.name);
var per2 = createPerson( "lemon", 23 );
console .log(per2.age);
console.log(per2 instanceof Object);//true
console.log(per2 instanceof createPerson);//false//无法区分该对象类型
console.log(per2.manager==per1.manager);//false 可得出per1和per2各自开闭空间
工厂模式的优势在于能够批量创建同类实例;其缺点在于所有实例共享相同的属性,造成内存浪费且无法区分对象的具体类型。
第三种方式是使用字面量创建对象。
字面量创建的优点是简单直接;缺点是无法批量构建具有相同结构的对象。
字面量创建对象
//字面量创建的对象使用constructor属性不会指向实例,而是指向object
//使用字面量创建
var per1 = {
name:"Ailer",
constructor:per1,
age:12,
gender:"female",
hobby:"play",
eat:function(){
console.log(this.name);
}
}
per1.eat();//ailer
per1.name="lemon";
per1.eat();//lemon
console.log(typeof per1);//Object
console.log(per1.constructor==Object);//true
第四种方式是通过new关键字结合构造函数来创建对象。
构造函数与new关键字
//构造函数创建对象,其子对象用instanceof不识别,所有采用new+obj创建
//对象识别了,但是仍然浪费一些代码区;==>产生原型创建
//创建js对象 new+构造函数
//1:创建构造函数 |通常首字母大写
function CreatePerson( name , age){
//2:把对象的属性|方法挂靠在this指针身上, 当调用该函数创建对象时,this指针就指向这个新对象;
//这个this就添加给这个对象
this.name = name;
this.age = age;
/*this.speak = function(){
//此处this也指向创建对象
console.log(this.name+" hello");
}
}
/* CreatePerson.prototype.gender = "20";
CreatePerson.prototype. ea = function(){
console .log(this.name+ "sfd" );
}*/
// __proto__:是:实例对象中的原型属性, 指向对应构造函数对应的原型对象
// [[prototype]]
//调用
var per1 = new CreatePerson( "ailer", "20" );
var per2 = new CreatePerson( "relia", "18" );
console .log(per1 instanceof CreatePerson); //==true
console .log(per2 instanceof CreatePerson); //==>true
console .log(per1.speak== per2.speak); //==false说明系统开辟了两个不同的代码区,造成了内存浪费.
由于字面量创建较为便捷,因此衍生出了构造函数模式。普通的构造函数(类似工厂模式)存在子对象无法通过instanceof识别且浪费内存的问题。引入new关键字配合构造函数后,子对象的类型得以正确识别,但仍有部分代码重复和内存浪费现象,这促使了原型模式的产生。
第五种方式是原型模式。
原型模式与动态原型
function CreateAnimal(name, age) {
//1.2:把外部参数绑定实例属性
this.name = name;
this.age = age;
}
//1.3把相同的属性,绑定在原型上(原型属性,原型方法)
CreateAnimal.prototype.gender = "male";
CreateAnimal.prototype.style = function() {
console.log(this.name + " ailers");
};
//2:调用构造函数创建对象
var cat1 = new CreateAnimal("xiaohua", "2");
var cat2 = new CreateAnimal("xiaohua", "2");
cat1.style();
console.log(cat1.style==cat2.style);//方法引用地址一样,将属性放到原型对象中,节约地址
//instanceof可以来判断对象属于哪一个【函数】
//constructor 建造者 也可以用来判断对象属于哪个【构造函数】 【常】
//实例对象保存一个 constructor属性指向它的构造函数
//instanceof and constructor 区别
console.log(cat1 instanceof CreateAnimal);//true
console.log(cat1 instanceof Object);//true
console.log(cat1.constructor == CreateAnimal);//true
console.log(cat1.constructor == Object); //==false
//构造函数的原型也有constructor属性指会构造函数
console.log(CreateAnimal.prototype.constructor == CreateAnimal);//true
//in判断该属性是否存在这个对象中,这个属性为实例属性或原型
// alert("name" in cat1)//true
// alert("gender" in cat1);//true
//hasOwnProperty:来判断某一个属性到底是实例属性,还是继承自原型属性 if 是 为true, else不存在|不是返回false;
console.log(cat1.hasOwnProperty("aaa"));//false 不存在的属性返回为false
console.log(cat1.hasOwnProperty("name"));//true 实例属性
console.log(cat1.hasOwnProperty("style"));//false 原型属性返回为false
//遍历属性找原型属性
//判断参数是否为原型属性 工具类
console.log(isPrototype("gender", cat1));//true
function isPrototype(proString, obj) {
if(proString in obj) {
if(!obj.hasOwnProperty(proString)) {
return true;
} else {
return false;
}
} else {
return false;
}
}
/*
function isProperty(object, property) {//判断原型中是否存在属性
return !object.hasOwnProperty(property) && (property in object);
}*/
在原型模式的基础上,还可以进一步优化为动态原型模式。
//构造函数中初始化原型
function per(name, age, gender) {
this.name = name;
this.age = age;
this.gender = gender;
//只在初始化原型的时候执行一次
if(typeof this.sayName != "function") {
Person.prototype.sayName = function() {
alert(this.name);
}
}
}
以上内容涵盖了JavaScript创建对象的主要方法,希望对读者的学习有所帮助,欢迎继续支持本站获取更多技术资讯。
JavaScript异步发送HTTP请求时怎么优雅地处理错误
2026-11-05 17:10:44
5款主流JS在线运行工具对比:CodePen、JSFiddle与StackBlitz怎么选
2026-11-05 17:04:04
JavaScript入门书籍避坑:这些书不适合初学者
2026-11-05 16:31:15
JS使用Math.round实现保留两位小数的原理与代码
2026-11-05 15:35:55
JavaScript 原生 Date 对象怎么实现日期加减
2026-11-05 14:30:00
