工厂函数
工厂函数 :用于创建对象的函数
function createPerson(name,age,sex){
//1.创建对象
let p = {}
//2.给对象赋值
p.name = name
p.age = age
p.sex = sex
//3. 返回对象
return p
}
let p1 = createPerson('张三',20,'男')
let p2 = createPerson('李四',22,'女')
console.log(p1,p2)
构造函数(面试常问)
构造函数 : 使用new调用的一个函数
-
构造函数作用与工厂函数一致,都是用来创建对象的。但是代码更加简洁。
-
构造函数 new 工作原理
(1) 创建一个空对象
(2) this 指向这个空对象
(3) 对象进行赋值
(4) 返回这个对象
-
构造函数首字母一般大写, 为了提醒调用者不要忘记new关键字
-
构造函数是不用加return的,new关键字会帮我们做这件事 但如果在构造函数内部 手动return呢?
return 值类型 : 无效,还是返回new创建的对象
return 引用类型 : 有效,会覆盖new创建的对象
function Object(name, age, sex) {
/* 1. 创建一个空对象
2. this 指向这个对象
3. 给对象赋值
4. 返回这个对象
*/
this.name = name
this.age = age
this.sex = sex
// return 666 返回无效
// return [0, 2, 3] 有效,会覆盖new创建的对象
}
console.log(new Object('张三', 20, '男'))
原型对象(面试常问)
原型对象 : 创建函数的时候,系统会自动创建一个对应的对象。 称之为原型对象。
作用 : 解决 内存资源浪费 + 全局变量污染
原型对象相关的三个属性 : 描述 构造函数、原型对象、实例对象三者关系
1.prototype : 属于构造函数 , 指向原型对象
2.constructor : 属于原型对象 , 指向构造函数
3.__ proto__ : 属于示例对象 , 指向原型对象
注意: 这个属性不是web标准,很多浏览器不会显示的。 这个属性在开发中不能使用,只能用于学习研究
//1.构造函数
function Person(name, age) {
this.name = name
this.age = age
}
//2.原型对象
Person.prototype.eat = function () {
console.log('吃东西')
}
Person.prototype.learn = function () {
console.log('学习')
}
console.log(Person.prototype.constructor) //Person
//3.实例对象
let p1 = new Person('张三', 20)
p1.eat() // 直接调用,不需要__proto__ 属性
/* 验证 构造函数、原型对象、实例对象三者关系 */
console.log(p1.__proto__.constructor) //Person
console.log(Person.prototype === p1.__proto__) // true
关系图: