引言
说到对象,我想到一个成语叫作谈虎色变,对象应该说是javascript中最难得一部分,原因呢,首先,js作为函数式编程语言,对象的实现方式跟java,c,c++等面向对象设计语言不一样;其次js面向对象编程属于高级程序员应该掌握的,对于初学者来讲,没有实践基础,凭空理解更是难上加难。不过不用担心,我也不怎么会,我们就一起来探讨一下吧。
1.对象封装
我们举个例子,大千世界,人心难测。每个人都是独立的,有自己的思维,性别,年龄,会跑,会跳等等,人就是一个单位,一个整体,然后人与人之间才会有血缘关系,社会关系。试想,一个人都不完整,还谈什么其他东西呢?所以我们的首先任务就是“造人”,造人的方式的有很多种,当然肯定不是你想的那种,哈哈!好,接下来,开始造人吧!
2.封装模式一:工厂模式
工厂模式的原理:在函数内部创建object对象,对象属性由参数指定,方法也挂在object对象上,最后返回这个object对象。相当于Person函数是一个造人工厂,一下子造了Tom,Linda两个人。但是缺点是不知道这两个人什么类型的,你会说都是object啊,对啊,你回答这个答案就像我问你你现在在哪?你说你在地球上一样的道理。我们应该知道,js里所有事物都是object类型,所以为了搞明白这两个人具体的类型,我们另有他法,那就是构造函数模式。
function Person(name,sex){
var o = new Object();
o.name = name;
o.sex = sex;
o.say = function(){
console.log(this.name + ' is '+ this.sex)
};
return o;
}
var Tom = Person('Tom','male');
var Linda = Person('Linda','female');
3.封装模式二:构造函数模式
构造函数模式相比工厂函数就是知道Tom和Linda这两个人是Person类型,原理是new关键字默认执行了以下操作:
1.创建一个全新的对象
2.这个对象会被执行[[prototype]]连接原型
3.函数调用中的this会绑定到新对象
4.如果函数没有返回其他对象,那么new 构造就会自动返回这个新对象
注意:这里我特意加粗这句话,因为文末讲的寄生构函数模式的理解需要仰仗这句话。先透个底,如果函数像工厂函数那样返回了对象,那么new关键词也就不会执行默认操作。
function Person(name,sex){
this.name = name;
this.sex = sex;
this.say = function(){
console.log(this.name + ' is '+ this.sex);
}
}
var Tom = new Person('Tom',