JS创建对象的几种方式

160 阅读1分钟

Js创建对象的几种方式(一)

需求:创建 3 个人的对象(姓名name、年龄age、性别gender、打招呼sayHi)

1、使用字面量的方式创建对象

 <script>
        let person1 = {
            name: 'Alice',
            age: 18,
            gender: '女',
            sayHi: function () {
                console.log(`我是${this.name},我今年${this.age}岁了`)
            }
        }
​
        let person2 = {
            name: 'Bob',
            age: 20,
            gender: '男',
            sayHi: function () {
                console.log(`我是${this.name},我今年${this.age}岁了`)
            }
        }
​
        let person3 = {
            name: 'Jane',
            age: 19,
            gender: '女',
            sayHi: function () {
                console.log(`我是${this.name},我今年${this.age}岁了`)
            }
        }
        
        person1.sayHi()
        person2.sayHi()
        person3.sayHi()
        console.log(person1, person2, person3)
</script>

优点:简易(单个对象);缺点:代码冗余,维护不变(多个对象)

2、使用工厂函数创建对象

<script>
        function createPerson(name, age, gender) {
            let person = {}
            person.name = name
            person.age = age
            person.gender = gender
            person.sayHi = function () {
                console.log(`我是${this.name},我今年${this.age}岁了`)
            }
            return person
        }
​
        let person1 = createPerson('Alice', 18, '女')
        let person2 = createPerson('Bob', 20, '男')
        let person3 = createPerson('Jane', 19, '女')
​
        person1.sayHi()
        person2.sayHi()
        person3.sayHi()
        console.log(person1, person2, person3)
</script>

优点:解决了创建多个对象的代码冗余问题

3、使用构造函数创建对象

3.1有参构造函数(适合创建多个)
<script>
        function Person(name, age, gender) {
            this.name = name
            this.age = age
            this.gender = gender
            this.sayHi = function () {
                console.log(`我是${this.name},我今年${this.age}岁了`)
            }
        }
        
        let person1 = new Person('Alice', 18, '女')
        let person2 = new Person('Bob', 20, '男')
        let person3 = new Person('Jane', 19, '女')
​
        person1.sayHi()
        person2.sayHi()
        person3.sayHi()
        console.log(person1, person2, person3)
</script>
3.2无参构造函数(适合创建单个)
 <script>
        function Person() { }
​
        let person1 = new Person()
        person1.name = 'Alice'
        person1.age = 18
        person1.gender = '女'
        person1.sayHi = function () {
            console.log(`我是${this.name},我今年${this.age}岁了`)
        }
​
        let person2 = new Person()
        person2.name = 'Bob'
        person2.age = 20
        person2.gender = '男'
        person2.sayHi = function () {
            console.log(`我是${this.name},我今年${this.age}岁了`)
        }
​
        let person3 = new Person()
        person3.name = 'Jane'
        person3.age = 19
        person3.gender = '女'
        person3.sayHi = function () {
            console.log(`我是${this.name},我今年${this.age}岁了`)
        }
​
        person1.sayHi()
        person2.sayHi()
        person3.sayHi()
        console.log(person1, person2, person3)
</script>

优点:构造函数作用与工厂函数一致,都是创建对象。但是构造函数代码更加简洁

缺点:每调用一次构造函数,就会堆内存中开辟一个新的函数,浪费内存资源

Js创建对象的几种方式(二)

1、使用原型对象的方式 prototype关键字创建对象

原型对象 : 当声明一个函数的时候,编译器会自动帮你创建一个与之对应的对象,称之为原型对象

原型对象作用 : 解决构造函数内存资源浪费 + 全局变量污染

如何访问

  • 构造函数.prototype
  • 实例对象可以直接访问原型中的一切成员
<script>
        function Dog() { }
        
        Dog.prototype.name = '旺财'
        Dog.prototype.price = 1000
        Dog.prototype.sell = function () {
            console.log(`我是${this.name},售价${this.price}元`)
        }
        
        let wangcai = new Dog()
        
        wangcai.sell()
        console.log(wangcai)
</script>

image.png

2、混合模式(原型+构造函数)

 <script>
        function Dog(name, price) {
            this.name = name
            this.price = price
        }
​
        Dog.prototype.sell = function () {
            console.log(`我是${this.name},售价${this.price}元`)
        }
        
        let mary = new Dog('美瑞', 10000)
        
        mary.sell()
        console.log(mary)
</script>

image.png

3、动态原型的方式(可以看做是混合模式的一种特例)

<script>
        function Dog(name, price) {
            this.name = name
            this.price = price
            if (typeof Dog.sell == "undefined") {
                Dog.prototype.sell = function () {
                    console.log(`我是${this.name},售价${this.price}元`)
                }
                Dog.sell = true
            }
        }
​
        Dog.prototype.sell = function () {
            console.log(`我是${this.name},售价${this.price}元`)
        }
​
        let mini = new Dog('米妮', 8000)
        
        mini.sell()
        console.log(mini)
</script>

image.png