构造函数通过prototype获取到原型
原型通过construxtor
实例通过_ proto _找到原型
构造函数与工厂函数之间差异: 1.工厂函数需要创建对象,以及必须有返回值 2.工厂函数针对的都是Object的对象模型,而构造函数可以匹配自定义的对象模型 即前者不论创建什么都只有一个xx instanceof Object 而后者根据自定义名而定类型,如上举例所示 3.构造函数弊端,如果在全局中定义相同的局部变量,容易造成全局污染,因为this.xx如果在局部获取不到,就会去全局中获取 4.构造函数可以重写,可以在全局中添加新属性和方法Person.prototype = {},但工厂函数只能在局部添加 各自适用场合: 构造函数:适应用于大型项目,属性以及方法时常变换的项目 工厂函数:适应用于小型项目,或者正在制作过程还没有成型的项目
工厂模式 :
特点:
1.显示创建的对象
2.显示返回的一个对象
3:缺点 :无法判断对象的类型
构造函数的特点:
1.没有显示的创建对象
2.隐式返回了新的对象
3.可以判断对象类型(属于这个构造函数)
4.缺点:
因私有而冗余:所有的方法和属性都会在实列上创建一遍
function Factory(name, age, sex, car) {
this.name = name;
this.age = age;
this.sex = sex;
this.car = car;
this.eat = function (food) {
console.log('吃' + food)
}
}
var obj = new Factory('我是', 10, 'nan', 'ff')
console.log(obj)
模拟构造函数创建对象(和上边这个函数关联着呢)
var obj = {};
Factory.call(obj, 'll', 18, '男');
obj._poroto_ = Factory.prototype;
console.log(obj)
原型模式
将属性和方法都放在原型对象上
function Hyj() { }
console.log(Hyj.prototype);
Hyj.prototype.name = 'hyj';
Hyj.prototype.age = 18;
Hyj.prototype.sex = '男';
Hyj.prototype.eat = function (food) {
console.log('吃' + food);
}
问题:
本质:因为共享的特征,导致原型上引用类型在各个实列上会影响
原型中所有属性是被很多实列共享的
对于包含引用类型值的属性来说,问题有点大
4.组合式 : 结构 + 原型
私有的属性
function People(name, age, sex) {
this.name = name; this.age = age; this.sex = sex;
} // 共享的方法
People.prototype.eat = function (food) {
console.log('吃' + food);
}
var a = new People(1, 2, 3)
console.log(a)