首先javascript都是基于对象操作的,但javascript并不是面向对象编程的语言;它没有类的一些特性,class,extends等,js的编程模式应该叫函数式编程;
以上说的基于ES6之前的;ES6版本之后,js也有了class的语法糖了;js的class语法糖,甜到太平洋;
当然这里我不多说Es6,由于h5的比赛是基于ES5标准的,因此我还是说说ES5如何应用面向对象编程;如果你有兴趣再去了解ES6的面向对象编程模式,你就会知道这块语法糖有多甜了;
切入正题
先定义一个person类,里面有name和age两个属性,和一个say()方法,我们用this来定义他们为独立属性,不会继承到子类去
function person(){
this.name = 'kervi';
this.age = 18;
this.say = function(){
alert('hi');
}
}
然后我们在给这个person类添加gender属性,和run()方法,这些属性是公共的,可以给子类基础的,我们用类的prototype属性来实现:
person.prototype.gender = 'man';
person.prototype.run = function(){
alert('runing~');
}
现在,我们new一个对象出来,用say方法打个招呼~,并且访问一下他的age属性和gender属性;
kervi = new person();
alert(kervi.gender);
alert(kervi.age);
kervi.say();
//弹出框 man
//弹出框 18
//弹出了框 hi
接着,我们定义另外一个类me,里面什么都不写。然后我们要他继承person;我是实现的方法是 把person的prototype属性赋值给me的prototype;
function me(){}
me.prototype = person.prototype; //让me继承person的公共属性
重点来了,我们new一下me,实例化一个obj对象
obj = new me();
前面的定义中,我们是没有给me类定义任何属性和方法的,继承了person;现在我们用obj对象调用一下公共方法run(),看看他是否继承了person的方法,再条用一个person的独立属性age,看看能否调用得了;
obj.run();
//弹出框 runing~
alert(obj.age);
//弹出框 undefined # undefined()未定义)说明调用不到独立属性
总结一下
- ES5可以用个this关键字来定义类的独立属性,可以用prototype来定义类的公共属性;
- ES5中,类继承 继承可以用prototype属性来实现(将父类的prototype属性赋值给子类的prototype)
拓展一下
在类中,this指的是类本身
prototype代表的则是 类的原形
ES5的面向对象编程的缺点很明显,就是可读性低。当你用ES6来进行面向对象的时候你就会发现这其中的差距了;简单写下ES6的类语法糖
class peron{
constructor (){ //注意下属性要写在 constructor方法里
this.name = 'kervi';
this.age = 18;
}
say (){alert('hi');}
}
kervi = new person();
kervi.say();
类的特性很直观,可读性很高==错误率低,你可以早点回家啦;当然,ES6的特点不止如此,还添加了static,extends等关键字,待你去研究