我的理解
今天重新看了下高程的面向对象设计那一章(重点是看了原型模式),下面有三种创建对象的方法:
1.工厂模式:
function createObj(name, usefor) {
var obj = new Object();
o.name = name;
o.usefor = usefor;
o.sayName = function() {
console.log(this.name)
}
return o;
}
var book1 = createObj('高程', '催眠')
2.构造函数模式
function Obj(name, usefor) {
this.name = name;
this.usefor = usefor;
this.sayName = function() {
console.log(this.name)
}
}
var book1 = new Obj('高程', '催眠')
var book2 = new Obj('高程1', '催眠1')
3.原型模式
function Obj(name, usefor) {
}
Obj.prototype.name = "高程";
Obj.prototype.usefor= "催眠";
Obj.prototype.sayName= function() {
console.log(this.name)
};
var book1 = new Obj()
1.工厂模式的缺点是:我们每次都要new Object出来,最后book1的对象类型就只有Object,也就是我们无法进行对象的识别;
2.构造函数:虽然构造函数能让我们知道Book1的的对象类型是Obj,当是其也有缺点,其缺点就是我们用这种方式创建出来的实例,他们的中的函数是不一致的,因为他们属于不同的作用域链和标识符;可以用下面例子做证明
console.log(book1.sayName == book2.sayName);
上面返回的是false;创建两个相同作用的函数是没有必要的,所以提在这里;
3.原型模式:我们创建的每个函数都有prototype属性的,而这个属性指的是一个对象,我们使用Obj.prototype.fn = function(){console.log(‘很晚了先睡觉’)}
这是相当于为prototype这个对象增加属性,而且这个属性能被所有由这个函数创建的实例给共享。所以当我们创建两个实例时,并没有创建两个作用相同的fn函数,两个实例用的还是Obj.prototype的fn。
上面可能有些说的不是很好,如果有不懂的可以在留言,大家一起研究研究,一起进步。