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

一、引用(reference)

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

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

但是,如果是字符串,就会出现不同的情况,见下面的代码:

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

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

二、函数重载

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

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

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

三、作用域

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

  1. var temp="oldTemp" //全局变量
  2. if(true)
  3. {
  4. var temp = "newTemp" //这里还在全局中
  5. }
  6. alert(temp == "newTemp") //发现相等

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

  1. var temp="oldTemp" ; //全局变量
  2. function test()
  3. {
  4. var temp = "newTemp";
  5. }
  6. test();
  7. alert(temp == "newTemp") ; //发现不相等

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

四、闭包

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

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

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

五、上下文对象

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

  1. var obj ={
  2. yes:function(){
  3. this.val = true;
  4. },
  5. no:function(){
  6. this.val = false;
  7. }
  8. }
  9. alert(obj.val == null); //这里我们发现对象obj没有val属性
  10. obj.yes(); //执行yes函数,obj有了val属性
  11. alert(obj.val == true);
  12.  
  13. window.no = obj.no //把obj的no函数传给window对象
  14. window.no();
  15. alert(obj.val == true) ; //发现没有变化
  16. alert(window.val == false) //window里的val变为false;

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

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

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

六、对象

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

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

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

  1. var obj = {
  2. val : 5,
  3. click: function(){
  4. alert("我被单击了");
  5. }
  6. }

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

  1. function User(name)
  2. {
  3. this.name = name;
  4. }
  5. var temp = new User("张三");
  6. alert(temp.name);

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

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

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

七、对象的方法

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

  1. function User(name,age)
  2. {
  3. this.name = name;
  4. this.age = age;
  5. }
  6. User.prototype.getName = function(){ return this.name};
  7. var user = new User("张三",25);
  8. alert(user.getName());

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

  1. function User(name,age)
  2. {
  3. this.name = name;
  4. this.age = age;
  5. this.getName = function(){ return this.name};
  6. }
  7.  
  8. var user = new User("张三",25);
  9. alert(user.getName());

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

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

  1. js中Json字符串如何转成Json对象(4种转换方式)

    js中Json字符串如何转成Json对象(4种转换方式) 一.总结 一句话总结:原生方法(就是浏览器默认支持的方法) 浏览器支持的转换方式(Firefox,chrome,opera,safari,ie ...

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

    在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: 1.一种为使用eval()函数. 2. 使用Function对象来进行返回解析. 第一种解析方式:使用eval函数来解析,并且使用j ...

  3. JS中new的自定义实现创建实例对象

    我们都知道在JS中通常通过对象字面量和new关键字来创建对象,那么今天我就来给大家讲讲new是怎么创建实例对象的:首先创建一个构造函数: function Person(name,age){ this ...

  4. JS中的Map和Set实现映射对象

    使用iterable内置的forEach方法 var a = ['A', 'B', 'C']; a.forEach(function (element, index, array) { // elem ...

  5. JS中的字符串可以直接调用字符串对象的属性和方法

    在JS中,会自动在字符串与字符串对象之间进行转换,因此,任何一个字符串常量都可以看作是一个String对象,其可以直接作为对象使用,只要在字符串变量的后面加 “.” 便可以直接调用String对象的属 ...

  6. js 中调用 Object.prototype.toString()来检测对象的类型

    1.使用toString()方法来检测对象类型 可以通过toString() 来获取每个对象的类型.为了每个对象都能通过 Object.prototype.toString() 来检测,需要以 Fun ...

  7. JS中的事件、数组、节点对象处理

    在JS代码中编写事件一定要保证页面在浏览器中加载时会把事件加载进页面 事件:在代码中可以通过一个动作来触发另一个行为的总称 A:事件的编写方式1 HTML标签中添加 onxxxx = "函数 ...

  8. js 中onclick 事件 点击后指向自己的对象,查找或者添加属性 用关键字this 传入参数 (可以改变原标签css)

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

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

    /** * 解决 ie,火狐浏览器不兼容new Date(s) * @param strDate * 返回 date对象 * add by zyf at 2015年11月5日 */ function ...

随机推荐

  1. (数据科学学习手札20)主成分分析原理推导&Python自编函数实现

    主成分分析(principal component analysis,简称PCA)是一种经典且简单的机器学习算法,其主要目的是用较少的变量去解释原来资料中的大部分变异,期望能将现有的众多相关性很高的变 ...

  2. POJ2739 Sum of Consecutive Prime Numbers 确定某个数以内的所有素数

    参考:https://www.cnblogs.com/baozou/articles/4481191.html #include <iostream> #include <cstdi ...

  3. itchat和matplotlib的结合使用爬取微信信息

    前几天无意中看到了一片文章,<一件有趣的事:我用 Python 爬了爬自己的微信朋友>,这篇文章写的是使用python中的itchat爬取微信中朋友的信息,其中信息包括,昵称.性别.地理位 ...

  4. 三角形xjoi 8.14

    问题描述:离圣诞节只有一个月了,家里要你准备一个很大的星星,然后把它粘在圣诞树的顶端.你已经准备好了一个三角形的银色包装纸来做星星,可忽然有一天你发现在这张大纸上被弄了好多的小洞,原来是你的弟弟妹妹已 ...

  5. Android使用butterknife注解出现nullPointerException解决

    1.下载butterknife加入到你的libs中,构建到你的项目中,此时还不能注解成功,必须进行2配置 2.选择你的项目右键---->properties----->java compi ...

  6. PHP.38-TP框架商城应用实例-后台14-商品管理-商品扩展分类的删除、修改

    商品分类删除 1.删除商品时,根据商品id删除扩展分类表数据 商品扩展分类修改 1.在控制器GoodsController.class.php/edit()中根据商品id取出对应的所有扩展分类 2.在 ...

  7. 【娱乐向】制作Chrome天气预报扩展程序

    1.什么是Chrome扩展程序 Chrome扩展程序是一个用Web技术开发,用来扩展增强浏览器功能的软件.和一般的网页一样,Chrome扩展程序由html.js.css和图片等部分组成.Chrome插 ...

  8. SQL Server附加数据库拒绝访问错误解决方法

    今天在MsSQL里附加数据库时提示操作系统错误5(拒绝访问),这里我没给出了两个解决方案供大家解决问题. 方案一:切换登录方式 出现这种情况是由于用“混合验证方式”(SQL Server身份验证)登录 ...

  9. Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. org/apache/hadoop/hbase/

    Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. org/apache/hadoop/hbase/ ...

  10. 使用Visual Studio 2017构建.Net Core的Docker镜像

    1 Docker  镜像优化 微软在为开发人员生成 Docker 镜像时,提供以下三种主要方案: 用于开发 .NET Core 应用的 镜像 用于构建生成 .NET Core 应用的 镜像 用于运行 ...