原文出自于本人我的博客网站:https://www.dzyong.com(欢迎访问)编程
本文连接地址: https://www.dzyong.com/#/View...设计模式
面对对象编程是一种程序设计范型。它将对象做为程序的基本单元,将程序和数据封装其中,以提升程序的重用性、灵活性和扩展性。
咱们以一个例子来开始学习。需求:对用户输入的用户名、邮箱、密码等进行验证。安全
实现这个需求很简单,小白的写法是:框架
function checkName() { //验证姓名 } function checkEmail() { //验证邮箱 } function checkPassword() { //验证密码 }
这是一种函数的形式来进行验证,可是这种写法的风险很大,若是是我的开发这样写的话问题不大,可是若是是团队开发,若是别人也定义了一样的方法就会覆盖掉原有的功能了。由于这3个函数属于全局变量。函数
为了不这样的问题发生,咱们可使用对象收编变量。学习
var CheckObject = { checkName : function(){ //验证姓名 }, checkEmail : function(){ //验证邮箱 }, checkPassword : function(){ //验证密码 }, }
此时将全部的函数做为CheckObject 对象的方法,这样咱们就只有了一个对象,而且咱们使用它也很简单,好比说检测姓名 CheckObject.checkName (),只是比原来的前面多了一个对象的名称。优化
对象的另外一种形式网站
对象还有另外一种形式,能够先声明对象,而后在为它添加方法,因此你能够这么作:this
var CheckObject = function(){} CheckObject .checkName = function() { //验证姓名 } CheckObject .checkEmail = function() { //验证邮箱 } CheckObject .checkPassword = function() { //验证密码 }
若是你想复制这个对象能够这样写:prototype
var CheckObject = function(){ return { checkName : function(){ //验证姓名 }, checkEmail : function(){ //验证邮箱}, checkPassword : function(){ //验证密码}, } }
这样作的好处是,每当调用这个函数的时候,把以前的那个对象返回出来,当别人每次调用这个函数的时候都返回一个新的对象,这样每一个人使用时就互不影响了。
var a = CheckObject (); a.checkName ();
虽然建立新对象完成了需求,可是它不是一个真正意义上类 的建立方式,而且建立的对象a和对象CheckObject 没有任何关系,接下来咱们就来建立也真正的类:
var CheckObject = function(){ this.checkName = function(){ //验证姓名 } this.checkEmail = function(){ //验证邮箱 } this.checkPassword = function(){ //验证密码 } }
类的建立方法就不能像对象那样,既然是一个类,就要用关键字new来建立
var a = new CheckObject (); a.checkName ();
全部的方法放在函数内部了,经过this定义的,因此每一次经过new关键字建立新对象的时候,新建立的对象就会对类的this上的属性进行复制。因此这些新建立的对象都有本身的一套方法,可是这么多有时候形成的消耗是很奢侈的,咱们须要处理一下:
var CheckObject = function(){} CheckObject .prototype.checkName = function(){ //验证姓名 } CheckObject .prototype.checkEmail = function(){ //验证邮箱 } CheckObject .prototype.checkName = checkPassword (){ //验证密码 }
这样建立对象实例的时候,建立出来的对象所拥有的方法都是一个,由于他们都要依赖prototype原型一次寻找,而找到的方法都是同一个,他么都绑定在CheckObject对象类的原型上。固然咱们还能够对上面的方式进行简化。
var CheckObject = function(){} CheckObject .prototype = { checkName : function() { //验证姓名 }, checkEmail : function() { //验证邮箱 }, checkName : function() { //验证密码 }, }
可是千万要注意,这两种方式不能混着用,不然一旦混用,如在后面为对象的原型对象赋值新对象时,它将覆盖掉以前对prototype对象赋值的方法。
使用仍是如同以前同样的方法使用;
var a = new CheckObject (); a.checkName (); a.checkEmail (); a.checkName ();
在以前的基础上还能够进一步的优化,不知你发现没,调用3个方法咱们须要写3遍a,这是能够避免的,在声明的每个方法末尾返回当前对象(JavaScript中this指向当前对象)。
var CheckObject = { checkName : function() { //验证姓名 return this; }, checkEmail : function() { //验证邮箱 return this; }, checkName : function() { //验证密码 return this; }, }
此时咱们就能够这样用:
CheckObject .checkName().checkEmail().checkName()
是否是感受简洁了不少,固然一样的方式也能够放到类的原型对象中:
var CheckObject = function(){} CheckObject .prototype = { checkName : function() { //验证姓名 return this; }, checkEmail : function() { //验证邮箱 return this; }, checkName : function() { //验证密码 return this; }, } var a = new CheckObject(); a.checkName().checkEmail().checkName()
prototype.js是一款JavaScript框架,里面为咱们方便的封装了不少方法,最大的特色就是能够对源生对象(Function、Array、Object等)的扩展,好比你想给一个函数都添加一个邮箱检测的方法能够这么作:
Function.prototype.checkEmail = function(){ //验证邮箱 }
这样使用这个方法就方便了不少:
函数的形式
var a = function(){} a.checkEmail ();
类的形式
var a = new Function(); a.checkEmail ();
可是为了安全咱们不容许这么作,由于这会污染源生的对象Function,形成没必要要的开销,你能够抽象出一个统一添加方法的功能:
Function.prototype.addMothed = function(name, fn) { this[name] = fn }
你就可使用以下的方式来添加你的方法
var motheds = function() {} 或 var motheds = new Function() motheds.addMothed('checkEmail ', function(){ // 检测邮箱 })
Function.prototype.addMothed = function(name, fn) { this[name] = fn; return this; } motheds.addMothed('checkEmail ', function(){ // 检测邮箱 }) .addMothed('checkName', function(){ // 检测姓名 })
也是返回方法的this来实现
motheds.addMothed('checkEmail ', function(){ // 检测邮箱 return this; })
使用类调用方式
Function.prototype.addMothed = function(name, fn) { this.prototype.[name] = fn; return this; }
使用类的方式时要注意,不能直接使用,须要经过new关键字来建立对象。
var m = new Methods(); m.checkEmail ()
原文出自于本人我的博客网站:https://www.dzyong.com(欢迎访问)
转载请注明来源: 邓占勇的我的博客 - 《JavaScript设计模式——面对对象的编程》
本文连接地址: https://www.dzyong.com/#/View...