在JS中,一切东东其实都是对象

对象是组成JavaScript的基本单元,在JS中,一切东东其实都是对象,而且功能非常强大,它不仅风格独特,功能也与众不同。

一、引用(reference)

引用的概念是JS的基础之一,它是指向对象实际位置的指针。见下面的例子:

var items = new Array("abc","def","hig");
//创建此数组的引用
var Ref = items;
items.push("klm");
alert(Ref.lenth);  //此处应该显示4

但是,如果是字符串,就会出现不同的情况,见下面的代码:赤壁市高级中学

var items = "abc";
var Ref = items;
items += "def";  //这里创建了一个新对象,而非原对象的修改。

现在Ref与items指向的是不同的对象。

二、函数重载

JS的每个函数都有一个变量argument,它是接收所有参数的伪数组。为什么是“伪”,因为你不能修改它,但它有length属性。我们看看下面的例子:

function  myFun(num1,num2)
{
	if(arguments.length == 2) { alert("我有两个参数"); }
	if(arguments.length == 1) { alert("我有一个参数"); }
}

接下来,我们调用函数myFun("abc");  myFun("abc","def");看看有什么不同,最重要的是,这本来就是函数重载嘛:)

三、作用域

在JavaScript里,作用域是由函数划分的,而不是由块(while,if,for)划分的。这样在理解有些代码时,可能会带来一些麻烦。为了对细节进行说明,我们看下面的例子:

var temp="oldTemp"    //全局变量
if(true)
{
	var temp = "newTemp"   //这里还在全局中
}
alert(temp == "newTemp")   //发现相等

但是如果我们在一个函数中声明并改变temp变量,效果则完全不同,见例子:

var temp="oldTemp" ;   //全局变量
function test()
{
	var temp = "newTemp";
}
test();
alert(temp == "newTemp") ;  //发现不相等

在JS中,全局变量是window对象的一个属性,在上面的例子中,全局变量temp  ==  window.temp,还有需要注意的是:如果某一个变量缺乏声明,就自动变为全局变量,虽然很可能它只在某个函数中使用。

四、闭包

闭包意味着内层的函数可以引用包围它的函数内的变量,即使外层函数已经终止。见下面的例子:

function AddNum(num1)
{
	return function (num2)
	{
  		return num1 + num2;
	}
}
var temp = AddNum(4);          //传入第一个参数,然后AddNum消失
var temp2 = temp(5);           //传入第二个参数,然后相加,返回9
alert(temp2);

这个例子很好体现了闭包的概念,是一种特殊情况,平时当然不这么用。

五、上下文对象

上下文对象通过this变量进行体现,这个变量永远指向当前代码所处的对象中。见下面的代码:

var obj ={
	yes:function(){
   		this.val = true;
	},
	no:function(){
   		this.val = false;
	}
}
alert(obj.val == null);   //这里我们发现对象obj没有val属性
obj.yes();                     //执行yes函数,obj有了val属性
alert(obj.val == true);

window.no = obj.no     //把obj的no函数传给window对象
window.no();
alert(obj.val == true) ;  //发现没有变化
alert(window.val == false)   //window里的val变为false;

这里不太好理解,幸运的是,JS为我们提供了call方法。见下面的例子:

function changeColor(color)
{
	this.style.color = color;
}
changeColor("Red");    //这里不行,因为window对象没有style属性
var temp = document.getElementById("temp");
changeColor.call(temp,"White");  //这里注意call的用法

call方法将上下文对象设置为第一个参数,并将其他参数作为原函数的参数。

六、对象

到这里我们才进入正题,但有了前面的概念,这也块内容其实也不是很多。我们直接看例子:

var obj = new Object();    //创建一个对象obj
obj.val = 5;               //创建属性obj,并为其赋值
obj.click = function()     //创建函数
{
	alert("我被单击了");
}

上面的代码与下段代码等价:

var obj = {
	val : 5,
	click: function(){
		alert("我被单击了");
	}
}

与其他面向对象语言不同的是,JS并没有Class的概念,在其他语言中,我们基本都需要实例化某个具体类的实例,但JS里却不同,它的做法是:任何函数都可以被实例化为一个对象。我们首先创建一个简单的对象:

function User(name)
{
	this.name = name;
}
var temp = new User("张三");
alert(temp.name);

如果上面的对象User只作为函数使用呢?

User("只作为函数使用");
alert(window.name);

this的上下文变成了window对象。

七、对象的方法

公共方法在对象的上下文中是最终用户可以接触到的。这里我们需要理解prototype(原型)属性。见下面的代码:

function User(name,age)
{
	this.name = name;
	this.age = age;
}
User.prototype.getName = function(){ return this.name};
var user = new User("张三",25);
alert(user.getName());

我们也可以动态创建公共方法,见下面的代码:

function User(name,age)
{
	this.name = name;
	this.age = age;
	this.getName = function(){ return this.name};
}

var user = new User("张三",25);
alert(user.getName());

动态生成的方法不是在代码第一次编译时就已经生成,这个技巧被利用prototype开销要大,但也更强大、更灵活。

时间: 2024-08-09 14:24:12

在JS中,一切东东其实都是对象的相关文章

让js中数据类型的所有方法都通用起来

数组可以拥有字符串的方法,字符串拥有数组的方法,而 json 同时拥有以上两种方法,是不是很神奇?其实我倒是喜欢管这种方法叫做「数据类型欺骗」. 首先说一下 js 中两个比较接近的数据,一个叫数组,一个叫 json.为什么先拿这两个讲呢?第一点,它俩都是一个" 爹 ",没错,都是Obj.再说一下他俩不一样的地方. json没有 length ,准确的说是 json 的 length 是 undefined .其实这只是这个对象的一个私有属性而已,因为没有这条私有属性,所以才是 unde

js中把JSON字符串转换成JSON对象最好的方法

在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: 1.一种为使用eval()函数. 2. 使用Function对象来进行返回解析. 第一种解析方式:使用eval函数来解析,并且使用jQuery的each方法来遍历 用jQuery解析JSON数据的方法,作为jQuery异步请求的传输对象,jQuery请求后返回的结果是json对象,这里考虑的都是服务器返回JSON形式的字符串的形式,对于利用JSONObject等插件封装的JSON对象,与此亦是大同小异,这里不再做说明. 这里首先

JS中数据类型、原始数据、内置对象、包装类型对象、typeof

JS中数据类型.内置对象.包装类型对象.typeof关系  https://segmentfault.com/a/1190000018275384 JavaScript 数据类型和数据结构   https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Data_structures 原始数据 https://developer.mozilla.org/zh-CN/docs/Glossary/Primitive 原文地址:https://www

js中String常用方法详解及String对象方法扩展

一.JavaScript 中 slice .substr 和 substring的区别: 1: String.slice(start,end): 一个新的字符串.包括字符串 stringObject 从 start 开始(包括 start)到 end 结束(不包括 end)为止的所有字符. 2: String.substring(start,end) 这个就有点特别了,它是先从start,end里找出一个较小的值. 然后从字符串的开始位置算起,截取较小值位置和较大值位置之间的 字符串,截取出来的

浅谈js中的执行环境和执行环境对象

什么是js的"执行环境",每当函数被调用的时候,就会产生一个新的执行环境,它是运行中的函数的意思,比方说运动员在奔跑的环境中,我们可以把运动员在奔跑的环境中,说成奔跑中的运动员,以此类推说成运行中的函数,行话叫”执行环境“. 下面我们就以一个例子进行分析执行环境对象,以下是执行环境对象的第一轮 以上的这个参数和函数都已被声明和赋值,并且局部变量已被声明,这个就是第一轮,接下来就是要执行第二轮 由于在执行环境中可以调用函数,其中会有很多的深度,其中又会设计到很多比较复杂的函数调用以及作用

js中使用new Date(str)创建时间对象不兼容firefox和ie的解决方式

还是上次的那个时间滑动条问题,突然发现在火狐和ie上面刻度和时间都没显示出来(本人开发的时候使用谷歌,当时没去测),于是就开始在那么多行代码中加断点调试,最后发现new Date(strDate);返回的是无效的时间格式,我就郁闷了~~~~~于是就去看api中看date的说明,就在里面找其它的构造方法尝试,果然功夫不负有心人啊!!!!终于可以安心的下班了!!!!代码如下: /** * 解决 ie,火狐浏览器不兼容new Date(s) * @param strDate * 返回 date对象 *

js中最重要的是:原型对象 普通对象和函数对象 构造函数

1.var lists=[{name:"jiali",age:28},{name:"jia",age:30},{name:"ki",age:30}]; var listCopy=JSON.parse(JSON.stringify(lists)); listsCopy[1]="aaa"; listsCopy;//索引1变了{name:"aaa",age:30} lists// 2.var arr=[{x:1,

JS中对JOSN的解析

一.什么是JSON? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式, 是理想的数据交换格式,同时,JSON是 JavaScript 原生格式. 非常适合于服务器与 JavaScript 的交互 二.为什么使用JSON而不是XML 他们都是这样说的: 尽管有许多宣传关于 XML 如何拥有跨平台,跨语言的优势,然而,除非应用于 Web Services,否则,在普通的 Web 应用中,开发者经常为 XML 的解析伤透了脑筋

js中addEventListener第三个参数涉及到的事件捕获与冒泡

js中,我们可以给一个dom对象添加监听事件,函数就是 addEventListener("click",function(){},true); 很容易理解,第一个参数是事件类型,比如点击(click).触摸(touchstart), 第二个参数就是事件函数, 比如我给一个button添加alert函数. window.onload=function(){ document.getElementById("hello").addEventListener("