javascript技巧

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript技巧 > JS创建对象

JS创建对象的六种方式

作者:sevenliao

在js中,对象是键值对的集合,可以通过很多种方式创建; 本文给大家介绍了六种创建方式:对象字面量、构造函数、Object.create()、工厂函数、class、单例模式,需要的朋友可以参考下

1.对象字面量(Object Literal)

用法: 直接通过{}定义对象,是最简单的方式;

原理: 直接分配内存创建一个普通对象,继承object.prototype;

例子:

const person {
    name: '小明',
    age: 25,
    greet() {
        console.log(`hi , i'm ${this.name}`)
    }
}
person.greet() //hi ,i'm 小明
const obj = {key:“value”};

//等价于:
const obj = new Object(); //隐式调用 Object 构造函数
obj.key = "value";

特点:

2.构造函数(constructor function)

用法:通过 new 关键字调用构造函数创建对象

原理: new 操作

例子:

function person(name, age){
    // this = {};  (隐式操作)
    // this.__proto__ = person.prototype; (隐式操作)
    this.name = name;
    this.age = age;
    this.greet = function(){
        console.log(`hi, i'm ${this.name}`)
    }
    
    // return this;  (隐式操作)
}

const xiaoming = new person('小明', 25);
xiaoming.greet(); //hi, i'm 小明


//原型链结构: xiaoming.__proto__ -> person.prototype -> Object.prototype -> null;

缺点:每个实例的方法都是独立的,浪费内存(可以优化共享原型方法);

3. Object.create()

用法:基于现有对象作为原型创建新对象。

原理:创建一个新对象,并将其Prototype 指向传入的对象;

例子:

const prototypeObj = {
    greet(){
         console.log(`hi, i'm ${this.name}`)
    }
}
const person = Object.create(prototypeObj);
person.name = "小明";
person.age = 10;
person.greet(); //hi , i'm 小明

扩展:可创建无原型的对象(Object.create(null)),适合纯粹的数据存储;

4.工厂函数(Factory Function)

用法: 封装对象创建逻辑的函数,直接返回新对象;

原理:手动创建对象并返回,不依赖 new 或原型链;

例子:

function createPeason(name,age){
    const obj = {}; //显示创建对象
    obj.name = name;
    obj.age = age;
    obj.greet = function(){}   //方法不共享
    return obj;
}
const xiaoming = createPeason('小明',10);
xiaoming.greet();  //hi, i'm 小明;

特点:避免 new 的使用,但方法无法共享(每个实例的方法独立)。

对比构造函数:

5.ES6 class 语法

用法:使用clase关键字定义类,通过new实例化;

原理:本质是构造函数的语法糖(构造函数另一种写法),基于原型链实现继承。

例子:

class Person {
    construtor(name,age){
        this.name = name;
        this.age = age;
    }
    greet(){
        console.log(`hi, i'm ${this.name}`)
    }
}
const xiaoming = new Person('小明',10);
xiaoming.greet(); // hi, i'm 小明;

//原型链结构: xiaoming.__proto__ -> Person.prototype -> Object.prototyle -> null;

优点: 语法更清晰,支持继承(extends)和静态方法(static)

6.单例模式(Singleton)

用法:确保一个类只有一个实例;

原理:通过闭包或模块化限制实例化次数

例子:

const singleton - (function(){
    let instance;
    function createInstance() {
        return { id: Math.random() };
    }
    return {
        getInstance(){
            if(!instance) instance = createInstance();
            return instance;
        }
    }
})();

const obj1 = singleton.getInstance();
const obj2 = singleton.getInstance();
console.log(obj1 === obj2); //true

汇总 - 总结对比

方式特点适用场景
对象字面量简单直接,适合一次性对象简单数据存储、配置项
构造函数可复用,但方法定义在原型上 节省内存需要多个相似实例
Object.create()灵活控制原型链,可创建无原型的对象原型继承、纯净对象
工厂函数避免 new, 但方法无法共享简单对象生活
class语法清晰,支持继承面向对象开发
单例模式全局唯一实例全局状态管理

选择建议:

以上就是JS创建对象的六种方式的详细内容,更多关于JS创建对象的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文