优化!优化!

网上看到一篇文章,虽然它讲的是一个js库内部的方法,但对我理解js的MVC模式还是很有帮助的,为防止以后访问不了,先抄下来:

$.Class为javascript模拟了继承的实现,他将jquery面向函数的编程和面向对象的编程衔接在一起。$.Class基于 John Resig 的Simple Class类库,除了原型继承外,他还有其他一些特性:静态继承、自描述(Introspection)、命名空间的支持、创建和初始化方法、更容易创建的回调函数。
  构造函数
  我们通过下面的方式生命一个类型:
$.Class( [NAME , STATIC,] PROTOTYPE ) -> Class
Name{可选:字符串}:如果设置了,将会把它作为fullName和shortName的值,并添加相应的命名空间。
Static{可选:Object对象}:如果设置了,会为Class添加静态的属性和方法。
Prototype:{Object对象}:为Class添加原型的属性和方法。
  当Class被创建的时候,静态的setup和init方法将会被执行。实例化一个类型的方式如下,并且原型的setup和init方法会在这一过程中被执行:
new Class([args ... ]) -> instance
  静态属性vs原型属性
  在开始学习Class之前,弄清楚静态属性和原型属性的区别是很重要的,我们来看例子:
//静态
MyClass.staticProperty  //共享属性  

//原型
myclass = new MyClass()
myclass.prototypeMethod() //实例方法
这里的静态和原型属性和c#,java中的静态和原型属性在使用上比较相似,只是实现的机制不一样。静态属性是类对象(而不是他的实例)本身具有的属性,在$.Class中我们可以使用this.constructor.XXX的方式访问它,但是在传统的javascript编程中只能通过Class.Property的方式访问,就像上例;原型属性是从原型链上继承下来的,或者是实例对象本身具有的。
  一个基本的类
  下面的例子创建了一个名叫Monster的类。
$.Class(‘Monster‘,
/* 这里定义的是静态属性 */
{
  count: 0
},
/* 这里定义的是原型属性 */
{
  init: function( name ) {  

    // 将name变量保存到实例的name属性中
    this.name = name;  

    // 设置health为10
    this.health = 10;  

    // 使用 this.constructor.XXX 的方式可以访问到静态属性,这里自增count属性的值
    this.constructor.count++;
  },
  eat: function( smallChildren ){
    this.health += smallChildren;
  },
  fight: function() {
    this.health -= 2;
  }
});  

hydra = new Monster(‘hydra‘);  

dragon = new Monster(‘dragon‘);  

hydra.name        // -> hydra
Monster.count     // -> 2
Monster.shortName // shortName是$.Class自带的一个静态属性 -> ‘Monster‘  

hydra.eat(2);     // health = 12  

dragon.fight();   // health = 8
 原型属性中的init方法相当于构造函数,本次实例化对象的时候,都会执行。
  继承
  当一个类被别的类扩展之后,他的所有静态和原型属性都会被继承。当你重写一个函数的时候,你可以通过使用this._super()访问他在父类中的实现。我们来创建一个新类SeaMonster :
Monster("SeaMonster",{
  eat: function( smallChildren ) {
    this._super(smallChildren / 2);
  },
  fight: function() {
    this.health -= 1;
  }
});  

lockNess = new SeaMonster(‘Lock Ness‘);
lockNess.eat(4);   //health = 12
lockNess.fight();  //health = 11
静态属性的继承
  你可以像这样实现静态属性的继承:
$.Class("First",
{
    staticMethod: function() { return 1;}
},{})  

First("Second",{
    staticMethod: function() { return this._super()+1;}
},{})  

Second.staticMethod() // -> 2
命名空间
  命名空间是个好东西,使用它可以把你的代码按功能分割,程序架构上更加合理;而且便于把代码移植到别的地方,而不用担心异常的产生。javascript本身不支持命名空间,所以只有采取一种变通的方式,例如我们可以使用单例模式。下面是$.Class中使用命名空间的例子:
$.Class("MyNamespace.MyClass",{},{});  

new MyNamespace.MyClass()
 自描述(Introspection)
  $.Class为类提供了字符串的名称实现自我表述的功能,看下例:
$.Class("MyOrg.MyClass",{},{})
MyOrg.MyClass.shortName //-> ‘MyClass‘
MyOrg.MyClass.fullName //->  ‘MyOrg.MyClass‘
fullName包括命名空间,shortName不包括命名空间,他们都是静态属性。
  创建和初始化方法
  $.Class提供了静态的和原型的初始化方法,以方便你完成类的创建,他们是setup和init。setup将会在init之前运行,一般情况下你不需要使用到他,但当你需要为init做一些复杂的工作,比如初始化init需要使用的参数时可以使用它。
$.Class("MyClass",
{
  setup: function() {} //static setup
  init: function() {} //static constructor
},
{
  setup: function() {} //prototype setup
  init: function() {} //prototype constructor
})
1.Setup:
  setup在init之前被调用,静态setup函数把基类的参数传递给扩展类,原型函数传递构造函数参数。如果setup返回数组,数组会作为init方法的参数,这样可以吧一些默认参数传递给init方法。你也可以再setup中放置经常要运行的代码。你不需要重写setup方法。
$.Class("jQuery.Controller",{
  ...
},{
  setup: function( el, options ) {
    ...
    return [$(el),
            $.extend(true,
               this.Class.defaults,
               options || {} ) ]
  }
})
 2.Init:
  init方法在setup之后运行,他们接收setup的结果作为参数。
$.Class("Foo", {
  init: function( arg1, arg2, arg3 ) {
    this.sum = arg1+arg2+arg3;
  }
})
var foo = new Foo(1,2,3);
foo.sum //-> 6
代理
  和jquery提供的代理方法类似,他返回一个回调函数,this总是指向Class或者Class的实例。下面例子中使用this.proxy以确保this.name是指向Todo实例的,这样show是就可以得到正确的值。
$.Class("Todo",{
  init: function( name ) {
      this.name = name
  },
  get: function() {
    $.get("/stuff",this.proxy(‘show‘))
  },
  show: function( txt ) {
    alert(this.name+txt)
  }
})
new Todo("Trash").get()

javascriptMVC入门 -- 3.jQueryMX -> $.Class

入门级js都是一些零散的function,然后搞一个start();方法,其内部执行所有页面loading后初始化要执行的方法。

然后一些牛人喜欢把自己的代码封装好了变成像插件一样可以重复利用,甚至还自定义标签。

但是,有一个我认为是误区的地方: 一个网站不可能处处都是封装好的插件,而你封装了自己的插件,并不代表其他部分的零散代码就可以没有思路清晰的结构。

我在读一个非常喜欢封装的牛人的代码的时候常常会发现他封装得太多,导致后期维护修改的问题,连他自己也常常忘记自己写的是什么意思了。。。

于是有后台的强人跟我说,你不能学他这样,你应该去看看《设计模式》,学学MVC。

虽然还没有好好去看过这本书,不过已经开始依样画葫芦学人家重构我的JS了。

学习上篇 P. R. May 写的global.js的结构:

<head>
<script type="text/javascript">
  $(function(){Suli.init();});
</script>
</head>

var Suli = Suli || {};
Suli.init = function () {
	new Suli.Functioname();
}
Suli.Functioname = function () {      api :{            init = function (){
       }
    },
    _fun = function ( ) {
     },
     api = {
          anything : function () {

          },
          dosomething : function () {

        },
...

return api.init();
}

把相关功能都放到一个具有标志性的函数中,该函数具有一个api对象,在api的init方法中执行子方法,return含有init方法的对象,在这个函数被实例化的的同时它就称为了一个构造函数。

优化!优化!

时间: 2024-11-11 13:42:50

优化!优化!的相关文章

搜索引擎优化优化的年夜前提是了解网站流量的出典

seo是要正在建站之初就理当去搞妥打算的,假如是一度曾经上线了的上网站,要做SEO搜索引擎优化时,那也要先办好搜索引擎优化规划,尔后,遵照妄想形式,过度少的改变网站的问题问题.关头词以及网站的简介,再不让损失踪减到最小.搜索引擎优化是没有能对于网站时常做年夜年夜的行动的.上面是本人拾掇的一些材料指望对于自己有协助 搜索引擎优化优化的年夜前提是体味网站流量的出典 搜索引擎优化优化的年夜前提是熟悉网站流量的出典. 搜索引擎优化优化的年夜前提是了解网站流量的出典.瞄准于没有一样的流量出典选择优化的设计

Django—— ORM查询(sql优化)优化了解,Django(元信息)元类建索引

Django(元信息)元类建索引 索引:索引的一个主要目的就是加快检索表中数据,索引是经过某种算法优化过的,因而查找次数要少的多.可见,索引是用来定位的. class Book(models.Model) name = models.CharField(max_length=64) class Meta: # 自定义表名 db_table = 'table_name' # 联合索引: 索引的一个主要目的就是加快检索表中数据 index_together = ('tag1', 'tag2') #

Mysql limit 优化优化

MySql 性能到底能有多高?用了php半年多,真正如此深入的去思考这个问题还是从前天开始.有过痛苦有过绝望,到现在充满信心! MySql 这个数据库绝对是适合dba级的高手去玩的,一般做一点1万篇新闻的小型系统怎么写都可以,用xx框架可以实现快速开发.可是数据量到了10万,百万至千万,他的性能还能那么高吗?一点小小的失误,可能造成整个系统的改写,甚至更本系统无法正常运行!好了,不那么多废话了.用事实说话,看例子: 数据表 collect ( id, title ,info ,vtype) 就这

性能优化-优化-JVM调优

1.JDK版本 尽可能的使用高版本的JDK版本,这通常可以带来免费的性能提升.当前前提是版本是稳定的,并且相应的应用服务器或者开源第三方工具等,也可以基于此版本稳定运行. 2.字节码验证 如果编译的代码,以及依赖的第三方jar包都是可信赖的话,可以关闭字节码验证,从而节省类加载时间,可通过-XVerify:none关闭字节码验证. 3.JIT编译方式 HotSpot有2种JIT编译方式,分别是Client模式和Server模式,Client模式的特点是启动快.占用内存少.JIT编译器生成代码的速

mysql优化-优化入门之MySQL的优化介绍及执行步骤

优化到底优化什么?      优化,一直是面试最常问的一个问题.因为从优化的角度,优化的思路,完全可以看出一个人的技术积累.那么,关于系统优化,假设这么个场景,用户反映系统太卡(其实就是高并发),那么我们怎么优化?如果请求过多,判定web服务器的压力过大,增加前端的web服务器,做负载均衡,如果请求静态界面不卡了,但是动态数据还是卡,说明MySQL处理的请求太多了,在应用层增加缓存.数据库层其实是最脆弱的一层,一般在应用设计时在上游就需要把请求拦截掉,数据库层只承担"能力范围内"的访问

MySQL性能优化---优化方案

1.对查询进行优化,应尽量避免全表查询,首先考虑在where及order by涉及的列上建立索引: 2.应尽量避免where子句中对字段进行null值判断,否则将导致引擎放弃使用索引而进行全表扫描:  创建一个普通索引: #普通索引 CREATE INDEX accountname ON accounts(accountname) 查询null值: EXPLAIN SELECT * FROM accounts WHERE accountname=NULL ##尽量使用IS NULL的方式来查询空

费马小定理优化优化多数的乘方

要求 a^b^c mod p 保证gcd(c,p)=1 用费马小定理 b:=quick_mod(b,c,p-1); c:=quick_mod(a,b,p); a^c mod p=a^(c mod phi(p)) mod p 而素数的phi函数是无需计算的,即p-1 推广到多个,依次降幂即可.不断应用快速幂. var a,b,c,p,ans:int64; function quickmod(a,b,p:int64):int64; var ret:int64; begin ret:=1; a:=a

记一次生产优化-优化定时提前加载用户信息

背景 最近,有不少用户反映登录我们的APP后,进入首页展示用户数据时要很久很久才能展示出来.刚开始还没在意,以为是用户自己的网络慢导致的,后来有好几个用户都反映了此问题,这不得不引起我们的重视了. 后来经过我们排查日志发现一个现象,提出该问题的用户都是基础数据比较多的,因为我们是金融软件,所以当用户的基础数据比较多的时候,在首页展示时会先去查询基础数据,然后在轮询这些基础数据查询接口得到结果之后再进行一些逻辑运算.有不少用户多达几十甚至上百条基础数据,所以导致查询时非常慢. 问题分析 这个问题的

mysql优化

索引的存储分类 MyISAM存储引擎的表的数据和索引时自动分开储存的.各自是一个独立的文件Inodb 存储引擎的表的结构和索引都是存储在一个表的空间里.但可以有多个文件组成 mysql目前不支持函数索引 mysql如何使用索引索引用于快速找出在某个列中有一特定值的行.对相关列使用索引时提供select操作性能的最佳途径 索引使用 使用like的查询   索引模糊尽量把 % 放到后面. select *from t2 where name like “%aa”(用不到索引) select *fro

优化php性能的一点总结

图示为100个并发,请求1000次目标地址 进行测试 最重要的两个参数:Requests per second :每秒接受请求数,这里每秒接收101个请求 Time per request:一个请求用多少耗时,这里是9毫秒 第一个参数越大越好,第二个参数越小越好 优化方法之语言级性能优化1 PHP代码执行流程:  PHP代码通过zend引擎逐行扫描,成为zend引擎能理解的语法,转码解析成Opcodes,执行之后输出 如果多使用内置函数的话,在扫描和理解上时间就会快很多,Opcodes也会少一些