上学时C#老师讲到对象有两类方法,静态方法(Static)和实例方法(非Static),当时不理解静态是为何意,只是强记。

  后来从事前端工作,一直在对类(即对象,Js中严格来说没有类的定义,虽众所周知,这里还是赘述一番,以免产生歧义)的操作上,严重缺乏整体概念,最近看extetnd中再次提到拓展静态方法与实例方法,故而再次百度,才幡然领悟,其实一直有用,只是不知其专业术语呀,哈哈~

静态方法,属于类的方法,即类可以直接调用的方法。为类所有实例化对象所共用(但不能用实例对象调用),所以静态成员只在内存中占一块区域;

实例方法,属于实例化类后对象的方法,即实例对象调用的方法。每创建一个类的实例,都会在内存中为非静态成员分配一块存储;

静态方法在一启动时就实例化了,因而静态内存是连续的,且静态内存是有限制的;而非静态方法是在程序运行中生成内存的,申请的是离散的空间。

看代码:

function A(){

}
A.staticMethof = function(){
alert('静态方法');
}
A.prototype.instaceMethod = function(){
alert('实例方法');
}
A.staticMethof(); //类A直接调用
var instace = new A();
instace.instaceMethod();//A的实例对象instace调用

  

拿jQuery框架来看,它的方法都是实例方法,它的工具函数都是静态方法。静态方法$.each(); 实例方法$('body').each();

说到这里就很好理解了。

下面来看下jQuery中拓展两种方法extend的用法。

其实当年看到各种框架和别人代码用到$.extend 和 $.fn.extend我是相当不开心的,哈哈,因为不懂... 现在讲了静态方法与实例方法,聪明的朋友应该可以猜到了,$.extend是拓展静态方法,而$.fn.extend是拓展实例方法,哈哈,聪明~

先说下extend。

extend,这个函数的功能基本都是实现对象的拷贝功能,即将一个对象的所有属属性拷贝到另外一个对象上去,开发插件时经常用到。

看代码:

jQuery.extend(object)

为jQuery类添加方法,即添加静态方法:

jQuery.extend({
  min: function(a, b) { return a < b ? a : b; },
  max: function(a, b) { return a > b ? a : b; }
});
jQuery.min(2,3); // 2
jQuery.max(4,5); // 5

  

Objectj Query.extend( target, object1, [objectN]);

为其他类添加静态方法(用一个或多个对象来拓展一个对象,返回被拓展的对象

var settings = { validate: false, limit: 5, name: "foo" };
var options = { validate: true, name: "bar" };
jQuery.extend(settings, options);
结果:settings == { validate: true, limit: 5, name: "bar" }

  

jQuery.fn

jQuery.fn = jQuery.prototype = {
   init: function( selector, context ) {//….
//……
};

原来jQuery.fn = jQuery.prototype,对prototype原型链是不陌生的吧?

jQuery.fn.extend( object );

对jQuery.prototype进行拓展,即添加实例函数。

例如要开发一个插件,编辑框被点击时,alert编辑框中的内容。

$.fn.extend({
alertWhileClick: function(){
$(this).click(function(){
alert($(this).val());
})
};
});
$("#input1").alertWhileClick();

你可以拓展一个对象到jQuery的prototype中去,这样的话就是插件机制了。

(function( $ ){
$.fn.tooltip = function( options ) {
};
//等价于
var tooltip = {
function(options){
}
};
$.fn.extend(tooltip) = $.prototype.extend(tooltip) = $.fn.tooltip
})( jQuery );

  

最新文章

  1. Python中操作mysql的pymysql模块详解
  2. Source Insight编辑器配置
  3. org.hibernate.hql.ast.QuerySyntaxException: XXX is not mapped
  4. JQuery设置和去除disabled属性
  5. 自动化测试管理平台ATMS(V2.0.1_8.12)下载
  6. Unity Adam特性整理
  7. iOS 导出 ipa 包时 三个选项的意义
  8. 动态调用WebService(C#)
  9. 团队作业week2-软件分析和用户需求调查
  10. linux网站推荐
  11. 添加Pods后,import无提示的解决办法
  12. 【HDOJ】4985 Little Pony and Permutation
  13. NSDictionary初始化,使用@{}方法,插入nil时会报空指针异常
  14. BI中事实表和维度表的定义
  15. PL/SQL配置大小写转换等快捷键
  16. 转 delphi SelText,GetText,SetText用法
  17. linux的学习系列 5--环境变量
  18. 使用XStream是实现XML与Java对象的转换(2)--别名
  19. Vue(day6)
  20. 程序到CPU的路径

热门文章

  1. SCAU 2015 GDCPC team_training1
  2. Python笔记(读取txt文件中的数据)
  3. mybatis复习笔记(1):
  4. MVC项目集成swagger
  5. Sql Server 出现此数据库没有有效所有者问题
  6. python基础--4 元祖
  7. 通过进程id找到进程对应的容器并统计每个进程的内存占用写到excel里
  8. js如何判断用户使用的设备类型及平台
  9. LOJ 2840「JOISC 2018 Day 4」糖
  10. POJ 2960 S-Nim (sg函数)