工厂模式
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 操作符。以这种方式调用构造函数会执行如下操作。
-
在内存中创建一个新对象。
-
这个新对象内部的[[Prototype]]特性被赋值为构造函数的 prototype 属性。
-
构造函数内部的 this 被赋值为这个新对象(即 this 指向新对象)。
-
执行构造函数内部的代码(给新对象添加属性)。
-
如果构造函数返回非空对象,则返回该对象;否则,返回刚创建的新对象。
问题:
相同函数被重复创建,如上例的 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