一、js设想形式-对症下药

1、一个邮箱考证的功用函数的写法有几种?

(1) 简朴的写法

function checkName(){};
function checkEmail(){};
function checkPassword(){};

剖析:这几个函数能够认为是几个全局变量,类似于

var checkName = function(){};
var checkEmail = function(){};
var checkPassword = function(){};

运用场景:适用于功用比较单一、自力的逻辑

长处:写法、用法都比较简朴

瑕玷:此时的函数作为全局变量存在,在这类状况多的时刻团队开辟时轻易被他人的变量掩盖,而且从营业上讲这几个属于一类函数,所以放在一个对象里的话代码的可读性大大提高

(2) 作为一个对象的一个属性的函数

1、 var CheckoutObject = {
      checkName: function(){},
      checkEmail: function(){},
      checkPassword: function(){},
    };

类似于

 2、var CheckoutObject = function(){};
    CheckoutObject.checkName = function(){};
    CheckoutObject.checkEmail = function(){};
    CheckoutObject.checkPassword = function(){};

运用场景:几个功用有肯定的逻辑或许类别上的关联,比方对表单的增编削查都属于对表单的操纵

剖析以及长处:这两种体式格局都只要一个全局变量,极大了减弱了定名争执的隐患,都能直接经由过程变量称号CheckoutObject直接运用要领,区别是2属于函数,在函数内部能够定义一切实例共有的属性,越发相符类的特性,越发详细的说1是2的一种语法糖、只是2的一种完成要领

瑕玷:1不太相符类的特性不能去实例化,虽然2能够经由过程new去建立对象然则建立的对象并不包括那些静态要领,关于函数变量CheckoutObject复用性比较差,而且包括属性并不自力
(3) 函数返回对象,该对象包括邮箱校验的要领

  var CheckoutObject = function(){
    return {
      checkName: function(){},
      checkEmail: function(){},
      checkPassword: function(){},
    };
  };
  // 挪用要领
  var test = new CheckoutObject();
  test.checkName();
  test.checkEmail();
  test.checkPassword();

运用场景:能够用来寄存一些大众属性,会被多人挪用,每次都天生新的实例

剖析:组织函数返回一个对象,对象包括所需的属性,每次new都是一个新对象,对象包括校验须要的属性

长处:每一个实例对象所包括的属性都是自力的

瑕玷:test的对象和CheckoutObject没什么关联,经由过程instanceof检测不出来,

(4) 更具有类特性的对象

var CheckoutObject = function(){
  this.checkName = function(){};
  this.checkEmail = function(){};
  this.checkPassword = function(){};
};
var test = new CheckoutObject();
console.log(test instanceof CheckoutObject); // true

特性:实例对象的范例是组织函数,如许更适用于封装
(5) 对象间同享的要领
剖析:上述建立的对象都是自力的具有本身的属性,然则这些属性是雷同的,如许造成了内存的糟蹋

var CheckoutObject = function(){};
CheckoutObject.prototype.checkName = function(){
  console.log('我叫小将');
};
var test1 = new CheckoutObject();
var test2 = new CheckoutObject();
test1.checkName(); // 我叫小将
test2.checkName(); // 我叫小将
console.log(test1.checkName === test2.checkName); // true

运用场景:各个实例都具有这个属性,如许就能够提取到原型对象中,减小内存消耗

长处:原型属性被一切属性所同享

瑕玷:实例的属性缺少自力性,所以自力属性和同享属性应当对症下药

(6) 更简朴的链式挪用

剖析:好的代码应当精简,能占一行绝不占两行

var CheckoutObject = {
  checkName: function(){ return this },
  checkEmail: function(){ return this }
}
CheckoutObject.checkName().checkEmail()

同享的也能够

var CheckoutObject = function(){};
CheckoutObject.prototype.checkName = function(){
  console.log(this);
  return this;
};
CheckoutObject.checkName()

运用场景:合适一系列操纵,比方本博文的校验

长处:挪用体式格局简约,易懂

瑕玷:每一个函数都必需返回当前this,也就是this必需指向当前实行环境

2、原生对象(比方Array)增加自力的要领

为原生对象增加属性通常是经由过程原型对象

Array.prototype.remove = function(){};

瑕玷:一切Array都具有了这个remove属性造成了污染
长处:假如大部分实例都须要这个要领这就成了长处了

Array.prototype.addMethod = function(name, fn){
  this[name] = fn;
};

如许一切的Array都具有addMethod这个属性,然则详细增加的要领是每一个实例所共有,详细用那种看实际运用场景,而且能够在addMethod函数内加一些别的的同享属性

链式增加和运用

Function.prototype.addMethod = function(name, fn){
  console.log(this === Method);
  this.prototype[name] = fn;
  return this;
};
var Method = new Function();
Method.addMethod('checkName', function(){
  console.log('姓名搜检');
  return this;
}).addMethod('checkEmail', function(){
  console.log('邮箱搜检');
  return this;
})

var method = new Method();
method.checkName().checkEmail();

运用场景:为原型对象增加同享要领,然则详细实行每一个原型实例能够本身定义

长处:供应同享的增加函数,详细增加的函数每一个Method自力,method再次同享

总结:综上能够看到每种体式格局都有其运用场景,要对症下药挑选最合适的形式

    原文作者:walker_jiang
    原文地址: https://segmentfault.com/a/1190000018450734
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞