`
willeager
  • 浏览: 95196 次
  • 性别: Icon_minigender_1
  • 来自: 福建
社区版块
存档分类
最新评论

JS prototype、类、对象、命名空间结合jQuery的理解

阅读更多

 

<script type="text/javascript">
	//-------------prototype对instanceof的影响----------------
	//使用new ABC()得到的东西继承了ABC的 prototype 的属性和方法
	//instanceof 的逻辑:先判断对象属于哪个类,再看那个类的prototype
	//1.没有return
	var jQuery = window.jQuery = window.$ = function( selector, context ) {
	};

	jQuery.fn = jQuery.prototype = {
		init:function(selector, context){
			selector = selector || document;// 确定selector存在
			if (selector.nodeType) {
				this[0] = selector;
				this.length = 1;
				return this;
			}
		}
	}
	var kk = new $(); //kk属于$
	alert(kk instanceof $.fn.init);//false
	alert(kk instanceof $);//true
	alert(kk instanceof Object);//true

	//2.添加return会把new $()对象抛弃  使得var kk = new $(); 和 var kk = $();的效果一致
	var jQuery = window.jQuery = window.$ = function( selector, context ) {
		 return new jQuery.fn.init( selector, context );
	};

	jQuery.fn = jQuery.prototype = {
		init:function(selector, context){
			selector = selector || document;// 确定selector存在
			if (selector.nodeType) {
				this[0] = selector;
				this.length = 1;
				return this;
			}
		}
	}
	var kk = new $(); //kk 属于jQuery.fn.init
	alert(kk instanceof $.fn.init);//true
	alert(kk instanceof $);//fasle
	alert(kk instanceof Object);//true

	//3.设置了prototype后 有没有return结果都一样
	jQuery.fn.init.prototype = jQuery.fn;
	//以下四个东西的内容一致
	alert(jQuery.fn.init);
	alert(jQuery.fn.init.prototype.init);
	alert(jQuery.fn.init.prototype.init.prototype.init);
	alert(jQuery.fn.init.prototype.init.prototype.init.prototype.init);

	//所以 jQuery.fn.init.prototype = jQuery.prototype
	var kk = new $(); //kk 属于jQuery.fn.init 
	alert(kk instanceof $.fn.init);//true
	alert(kk instanceof $);//true
	//-------------prototype对instanceof的影响----------------


	


//第一个括号里面是个匿名函数,第二个括号表示马上执行第一个括号里面的代码。
(function(id){
	
	//-------创建对象------------
	var TE = {}; //相当于TE=new Object();
	alert(typeof Object); //function
	alert(typeof Array);//function
	//Js中特别的一个东西
	alert(typeof Math);//Object	由于prototype只能用于function, Math.prototype这个会导致语法错误

	//如何创建对象
	//1.静态类,只有静态属性和静态方法 不能使用new
	var DI = {
		name:"name",
		sex:"sex",
		age:12,
		dfunc:function(){
			alert('dfunc');
		},
	}
	//使用下面的方法添加静态属性和方法
	DI.n2='n2';
	DI['n3']='n3';
	DI.f2=function(){}
	DI['f3']=function(){}

	
	//2.拥有动态、静态属性以及方法
	//prototype称为类的原型,用来添加类的动态属性和方法,必须通过对象调用
	//以下四种方式添加的都是动态的         
	function ClassTest(){
		//(1).类内部
        this.name1='name1';
		this.func1=function(){
			alert('func1');
		}
		//(2).类内部
		ClassTest.prototype.name2='name2';
		ClassTest.prototype.func2=function(){
			alert('func2');
		}
		//(3).类内部
		this['name3']='name3';
		this['func3']=function(){
			alert('func3');
		}
	}
	var cct = new ClassTest();
  	//(4).类外部
   	ClassTest.prototype.name4='name4';
	ClassTest.prototype.func4=function(){
		alert('func4');
	}
	cct.func4();//执行成功,可见建立了对象后,再使用prototype,已建的对象也生效
	
	//定义类的静态属性和方法,不能通过对象调用,直接使用类名.方法()调用
	ClassTest.staticName='staticName';
	ClassTest.staticFun=function(){
		alert('staticFun');
	};
	ClassTest['staticName2']='staticName2';
	ClassTest['staticFun2']=function(){
		alert('staticFun2');
	};

	alert(typeof ClassTest); //function]
	alert(ClassTest.prototype instanceof Object);//true
	

	var CT = new ClassTest();//创建对象
	alert(typeof CT); //object
	//添加对象属性\方法  
	CT.name5 = 'name5';
	CT.func5 = function(){
		alert('func5');
	}
	CT['name6'] = 'name6';
	CT['func6'] = function(){
		alert('func6');
	}
	//-------创建对象------------


	//---------命名空间-----------------用于理解类、对象与属性之间的关系
	
	window.ClassTest = ClassTest; //window对象的属性ClassTest是个类ClassTest
	window.CT = CT; //window对象的CT属性是个对象CT
	
	alert(typeof window.CT); //object
	alert(typeof window.ClassTest); //function
	
	//这种情况理解为定义了KJ和window.KJ两个变量
	window.KJ={};
	alert(typeof window.KJ); //object
	alert(typeof KJ); //object

	//多层命名空间
	window.CT.CT2=function(){};
	alert(typeof window.CT.CT2);//object
	//---------命名空间-----------------
})(12);


</script>

 

//以下都执行正常,说明cd,ab都是引用?
var cd = ab = {};
ab.func = function(){
	alert(1);
}
cd.func();
cd.f2 = function() {
	alert(2);
}
ab.f2();

 

 this的含义

//---------函数方法中this的意义--------
	var aa = window.aa= function(){
		alert(this);
		alert(this instanceof aa);
		return 1;
	}
	aa(); //[Object window] false
	new aa(); //[Object Object] true

	aa.extend = function(){
		alert(this);
	}
	aa.extend();//aa方法
	new aa.extend();//[Object Object]
	//---------函数方法中this的意义--------
	

 

//类中的this
var obj = {
	func1 = function(){
		alert(this);//只当前的obj对象
	}
}

 

 

 

 

 

 

分享到:
评论

相关推荐

    jquery自定义插件命名空间问题

    这里的`$.fn`是jQuery对象的prototype,实际上就是`jQuery.prototype`,这样我们就可以在任何jQuery选择器后直接调用`myPlugin`方法,如`$('selector').myPlugin()`。 命名空间在jQuery插件中起着关键作用,因为它...

    jQuery源码分析-03构造jQuery对象

    `jQuery.fn`和`jQuery.prototype`指向同一个对象,这使得所有jQuery对象都能够共享相同的方法和属性。其中`init`方法负责处理不同的`selector`参数,并返回一个包含所选元素的jQuery对象。 #### 四、处理不同的`...

    prototype 开发应用手册,笔记,prototype.js文件下载

    Prototype的命名空间管理机制避免了全局变量污染,提高了代码的可读性和可维护性。 在手册中,你将了解到如何利用Prototype创建和操作DOM元素,如查找、添加、删除和修改HTML元素。Prototype提供了简洁的链式调用...

    jQuery.js执行过程分析

    2. **构造函数与命名空间**: jQuery定义了一个构造函数,同时通过`window.$ = jQuery;`将jQuery绑定到全局变量`$`,方便外部调用。这样,开发者可以通过`$`或`jQuery`来访问和使用jQuery的功能。 3. **原型链扩展...

    ecshop transport.js和jquery冲突的问题

    ECSHOP是一个流行的开源电商系统,它使用了 Prototype.js 作为默认的JavaScript库,而jQuery是另一个广泛应用的JS库。在尝试将ECSHOP与使用jQuery的插件或功能集成时,可能会遇到`transport.js`和`jquery`的冲突问题...

    prototype.js 1.4-1.6[全]

    Prototype.js 是一个广泛使用的JavaScript库,它扩展了JavaScript语言的功能,为开发人员提供了更强大的面向对象编程支持。该库的核心特性是其对JavaScript原型(prototype)机制的深入利用,使得JavaScript对象的...

    jQuery源码解读

    整个jQuery库被包裹在一个立即执行的匿名函数中,这样可以确保其中定义的所有函数和对象只在这个作用域内可见,起到了类似命名空间的效果。同时,jQuery将其自身和$符号绑定到window对象,使得用户可以在全局范围内...

    JavaScript libraries--->jQuery, Prototype, Mootools, YUI, Extjs, Dojo

    在给定的标题"JavaScript libraries---&gt;jQuery, Prototype, Mootools, YUI, Extjs, Dojo"中,提到了五种著名的JavaScript库:jQuery、Prototype、Mootools、YUI和ExtJS。这些库都有各自的特性和优势,下面将详细介绍...

    prototype.js.cn.doc.rar

    Prototype.js是一款强大的JavaScript库,由Sam Stephenson开发,旨在简化JavaScript的编程,提供了一系列实用的函数和类扩展,增强了JavaScript的基本功能。这款库的核心理念是通过类原型(Class Prototyping)实现...

    js框架Jquery知识讲解

    - jQuery对象是jQuery库中的封装对象,可以执行jQuery特有的方法;DOM对象是原生JavaScript的对象,用于操作HTML元素。两者之间可以通过`.get()`和`$(...)`进行相互转换。 4. **同时使用 prototype 和 jQuery** -...

    jquery 插件开发 pdf

    `$.fn`是jQuery对象的别名,代表了原型链`jQuery.prototype`。 - 插件内部应封装所有功能,避免污染全局作用域。 3. **参数传递** - 插件可以通过传递参数来自定义其行为。这些参数可以在调用插件时提供,如`$('...

    jQuery插件开发全解析.pdf

    类级别的插件可以添加到jQuery的命名空间中,而对象级别的插件则为jQuery对象增加了可调用的方法。开发者可以通过全局函数添加、命名空间封装、立即执行函数表达式以及插件命名等方式来构建插件。这不仅提高了代码的...

    jQuery插件开发全解析

    对象级别的插件开发是指给jQuery对象添加方法。这些方法通常用于操作DOM元素。 **2.1 在JQuery名称空间下声明一个名字** 可以使用`.extend()`方法或直接定义方法的方式: **形式1**: ```javascript (function($...

    jQuery插件

    `$.fn` 是 jQuery.prototype 的别名,扩展它意味着可以将新的方法应用到所有jQuery对象上。 3. **初始化和配置**: 在主函数内,可以处理用户传递的参数,设定默认值,并对选中的元素进行操作。 4. **编写插件...

    javascript 类, 对象 深入学习

    首先,我们需要明白在JavaScript中,类是一种语法糖,实际上它是基于原型(prototype)的面向对象编程。ES6引入了`class`关键字,使得代码更加简洁易读,但其底层仍然是基于函数和原型操作。因此,理解函数和原型是...

    找到了一篇jQuery与Prototype并存的冲突的解决方法

    例如,jQuery和Prototype都是非常流行的JavaScript框架,但它们的使用方式和变量命名可能会导致冲突。今天,我们就来讨论如何解决jQuery与Prototype并存的冲突问题。 首先,我们需要了解为什么jQuery和Prototype会...

    让ecside2离开prototype.js

    Prototype.js是一个广泛使用的JavaScript库,它提供了许多实用的函数来扩展JavaScript的基本对象和类。而ecside2可能是另一个JavaScript库或工具,其原始设计可能依赖于Prototype.js,但现在我们希望在不依赖...

Global site tag (gtag.js) - Google Analytics