设计模式(一) 面向对象

首先先看几个函数:

function checkName () {){}// 验证姓名
 function checkEmail() {} // 验证邮箱
 function checkPassword() {} //验证密码

这相当于创建了三个全局变量,那么就有一个问题出现了,难道函数是变量? 接下来解决这个问题。

首先,函数的另一种表现形式:看下边的三个函数。

var checkName =  function () {){}// 验证姓名
var checkEmail = function () {} // 验证邮箱
var checkPassword = function () {} //验证密码

比较上边两种写法,其实是一样的。。。。。

但是这么看的话,就会发现创建了3个函数保存在变量里来实现功能。

但是,问题又来了。这有什么问题呢?

首先,从功能上来说,是没有问题的。

但是,在团队开发中所写代码的时候就不能只考虑自己了。也要考虑到别人。如果别人也定义了相同的方法,就会覆盖原有的,如果你定义了很多方法,那么这种互相覆盖的问题也是不容易察觉的。

那么,问题又来了。怎么做呢?

那么就是 :用对象收编变量。

可以创建一个检测对象,然后把方法放到里边:

看下边代码:

var CheckObject = {
    checkName : function () {){}// 验证姓名
    checkEmail: function () {} // 验证邮箱
    checkPassword : function () {} //验证密码
}

那么,调用的时候就是 CheckObject.checkName()来调用对象里边的方法。也就是在原来是勇士函数式前面多了一个对象名称。那么,既然可以通过点语法来使用方法,那么是不是能这么创建呢

是的,可以。 对象的另一种形式

var CheckObject = function (){};
CheckObject.checkName = function(){} //验证姓名
CheckObject.checkEmail = function () {} //验证邮箱
CheckObject.checkPassword = function () {} //验证密码

使用和前面是一样的,CheckObject.checkName(),但是别人想用你写的对象方法时,就有些麻烦了,因为对象不能复制一份,或者说这个对象类在用new 关键字创建新的对象时,新创建的对象是不能继承这些方法的。接下来介绍一种 真假对象

 var CheckObject = function () {
    return {
     checkName:function () {}, //验证姓名
     checkEmail:function (){},// 验证邮箱
     checkPassword:function(){}//验证密码  
}      
}

调用即:var a = CheckObject(); a.checkEmail()。当别人想要调用这个函数时,都会返回一个新对象,这样执行过程中明面上是CheckObject 对象,实际上是返回的新对象。

虽然通过创建了新对象完成需求,但是他不是一个真正的类的创建方式,并且创建的对象a 和 CheckObject 没有任何关系,所以要稍加改造一下。

var CheckObject = function () {
  this.checkName = function () {
       
  } ,
  ...     
}

这种调用方法 这是一个类,那么就是 用到new 关键字 var a = new CheckObject();a.checkName()。

现在我们已经把所有方法都放在了函数内部。通过this 定义所以每次通过new关键字定义的时候,新创建的对象都会对类的this上的属性进行复制。所以这些新创建的对象都会有自己的一套方法,然而有时候这样是很奢侈的。我们需要处理一下。

var CheckObject = function () {};
CheckObject.prototype.checkName = function() {}; //验证姓名

...

这样创建的好处是,创建的对象所拥有的方法就都是一个了,都要依赖prototype原型一次查找,它们都绑定在CheckObject对象类的原型上,,但是我们还可以继续优化一下

var CheckObject = function () {};
CheckObject.prototype = {
    checkName : function() {}, //验证姓名

    
    ...  
}

那么使用类:var  a = new CheckObject(); a.checkName();

但是依照上边的方法,调用CheckObject 对象的方法.每次都要调用(a. 方法名)是不是感觉很麻烦。

那么换一种方法

var CheckObject = function  () {};
CheckObject.prototype = {
   checkName:function () {return this;}, //验证姓名
checkEmail:function () {return this;}
}

那么调用就是 var a = new CheckObject();a.checkName().checkEmail()  .是不是很省事。

猜你喜欢

转载自www.cnblogs.com/xueyelone/p/11939145.html