<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script>
// Constructor Function
function CreateUser(name, age) {
// 1.创建一个空白对象 ---- 原材料========== this
// var this = new Object(); // {}
// 2.添加属性和方法 ------- 加工
// 2.1 添加属性
this.name = name;
this['age'] = age;
this.eyes = 2;
// 2.2 添加方法
this.getName = function() {
return '我的名字是' + this.name;
}
this.getAge = function() {
return this.name + '已经' + this.age + '岁了.';
}
// this.innerCommon = function() {
// console.log('我是一个内部函数, 只想被内部方法使用, 不想被外部访问');
// }
// 对this.innerCommon 进行改造 开始
function innerCom() {
console.log('我是一个内部函数, 现在只能被内部方法使用');
}
// Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。
Object.defineProperty(this, 'innerCommon', { // innerCommon 是构造函数的属性, 也就是 this.innerCommon
value: innerCom, // 这是闭包函数的名字
writable: true, // writable 默认值是false, 表示上面的value的值不可被改写
enumerable: false
})
// Object.freeze(this);
// 对this.innerCommon 进行改造 结束
// return --------------- 出厂
//
// 用new操作符实例化对象的时候, return 动作会自动发生
// return this;
}
// 注意: 工厂模式没有new(不用new 说明他要的就是不用new时候的功能, 并没有特殊原因.)
var oneUser = new CreateUser("张三", 19);
// var a = oneUser;
oneUser.eyes = 4;
oneUser.innerCommon = false; // 这一行 会导致下面的 innerCommon() 失败(writable: true)
console.log('oneUser----', oneUser.innerCommon());
var anotherUser = new CreateUser("张三", 19);
console.log('anotherUser----', anotherUser);
// 在实例化函数的时候 使用new, 系统会偷偷的为我们做两件事:
// -- 创建一个空对象(作为将要返回的对象实例)
// -- 替我们返回这个对象
// 注意:将该空对象的原型对象,指向了构造函数的 prototype 属性对象
/*
onerUser 和 anotherUser 没有公用同一个方法, 每new一次, 系统都会新开辟一块内存,独立存放
虽然他们具有相同的功能, 但不是同一个, 所以这不是我们所期望的.
正因为这个缺点, 继而有了 原型+构造函数的方式?
*/
</script>
</body>
</html>
上述运行结果:
构造函数和工厂模式的区别在于,工厂模式是在函数里面新建一个对象,在该对象里添加属性和方法。而构造函数是在函数里用this.的方式,直接添加属性和方法。