JavaScript创建对象的几种方式

工厂模式

function createPerson(name, age){
    let o = new Object()
    o.name = name
    o.age = age
    o.sayName = function(){
		console.log(this.name)
    }
}
let person1 = createPerson('Rick', 18)
复制代码

函数 createPerson() 接收 3 个参数,根据这几个参数构建了一个包含 Person 信息的对象。 可以用不同的参数多次调用这个函数,每次都会返回包含 3 个属性和 1 个方法的对象。

这种工厂模式虽 然可以解决创建多个类似对象的问题,但没有解决对象标识问题(即新创建的对象是什么类型)

构造函数模式

function Person(name, age){
    this.name = name
    this.age = age
    this.sayName = function(){
        console.log(this.name)
    }
}

let person1 = new Person('Rick', 12)
复制代码

要创建 Person 的实例,应使用 new 操作符。以这种方式调用构造函数会执行如下操作。

  1. 在内存中创建一个新对象。

  2. 这个新对象内部的[[Prototype]]特性被赋值为构造函数的 prototype 属性。

  3. 构造函数内部的 this 被赋值为这个新对象(即 this 指向新对象)。

  4. 执行构造函数内部的代码(给新对象添加属性)。

  5. 如果构造函数返回非空对象,则返回该对象;否则,返回刚创建的新对象。

问题:

相同函数被重复创建,如上例的 sayname

原型模式

每个函数都会创建一个 prototype 属性,这个属性是一个对象,包含应该由特定引用类型的实例共享的属性和方法。实际上,这个对象就是通过调用构造函数创建的对象的原型。

使用原型对象的好处 是,在它上面定义的属性和方法可以被对象实例共享。原来在构造函数中直接赋给对象实例的值,可以直接赋值给它们的原型。

function Person(){
    Person.prototype.name = 'Rick'
    Person.prototype.age = 12
    Person.prototype.sayName = function(){
        console.log(this.name)
    }
}
let person1 = new Person()
let person2 = new Person()
person1.sayName() // Rick
person2.sayName() // Rick
 
console.log(person1.sayName === person2.sayName) // true
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享