“一切都是对象”这句话的重点在于如何去理解“对象”这个概念。

当然,也不是所有的都是对象,值类型就不是对象。 首先咱们还是先看看javascript中一个常用的运算符——typeof。typeof应该算是咱们的老朋友,还有谁没用过它?
typeof函数输出的一共有几种类型,在此列出:

function show(x) {console.log(typeof x);    // undefinedconsole.log(typeof 10);   // numberconsole.log(typeof 'abc'); // stringconsole.log(typeof true);  // booleanconsole.log(typeof function () {});  //functionconsole.log(typeof [1, 'a', true]);  //objectconsole.log(typeof { a: 10, b: 20 });  //objectconsole.log(typeof null);  //objectconsole.log(typeof new Number(10));  //object
}
show();

以上代码列出了typeof输出的集中类型标识,其中上面的四种(undefined, number, string, boolean)属于简单的值类型,不是对象。剩下的几种情况——函数、数组、对象、null、new Number(10)都是对象。他们都是引用类型。

判断一个变量是不是对象非常简单。值类型的类型判断用typeof,引用类型的类型判断用instanceof。

var fn = function () { };
console.log(fn instanceof Object);  // true

好了,上面说了半天对象,各位可能也经常在工作中应对对象,在生活中还得应对活生生的对象。有些个心理不正常或者爱开玩笑的单身人士,还对于系统提示的“找不到对象”耿耿于怀。那么在javascript中的对象,到底该如何定义呢?

对象——若干属性的集合。
java或者C#中的对象都是new一个class出来的,而且里面有字段、属性、方法,规定的非常严格。但是javascript就比较随意了——数组是对象,函数是对象,对象还是对象。对象里面的一切都是属性,只有属性,没有方法。那么这样方法如何表示呢?——方法也是一种属性。因为它的属性表示为键值对的形式。
而且,更加好玩的事,javascript中的对象可以任意的扩展属性,没有class的约束。这个大家应该都知道,就不再强调了。

先说个最常见的例子:

var obj={a: 10,b: function(x){alert(this.a + x);},c: {name: 'username',year: 2017}
};

以上代码中,obj是一个自定义的对象,其中a、b、c就是它的属性,而且在c的属性值还是一个对象,它又有name、year两个属性。
这个可能比较好理解,那么函数和数组也可以这样定义属性吗?——当然不行,但是它可以用另一种形式,总之函数/数组之流,只要是对象,它就是属性的集合。
以函数为例子:

var fn = function () {alert(100);};fn.a = 10;fn.b = function () {alert(123);};fn.c = {name: "王福朋",year: 1988};

上段代码中,函数就作为对象被赋值了a、b、c三个属性——很明显,这就是属性的集合吗。
你问:这个有用吗?
回答:可以看看jQuery源码!
在jQuery源码中,“jQuery”或者“$”,这个变量其实是一个函数,不信你可以叫咱们的老朋友typeof验证一下。

console.log(typeof $);  // function
console.log($.trim(" ABC "));

验明正身!的确是个函数。那么咱们常用的 $.trim() 也是个函数,经常用,就不用验了吧!
很明显,这就是在$或者jQuery函数上加了一个trim属性,属性值是函数,作用是截取前后空格。
javascript与java/C#相比,首先最需要解释的就是弱类型,因为弱类型是最基本的用法,而且最常用,就不打算做一节来讲。
其次要解释的就是本文的内容——一切(引用类型)都是对象,对象是属性的集合。最需要了解的就是对象的概念,和java/C#完全不一样。所以,切记切记!
最后,有个疑问。在typeof的输出类型中,function和object都是对象,为何却要输出两种答案呢?都叫做object不行吗?——当然不行。
具体原因,且听下回分解!

深入理解javascript原型和闭包(1)——一切都是对象相关推荐

  1. 深入理解javascript原型和闭包(16)——完结

    之前一共用15篇文章,把javascript的原型和闭包. 首先,javascript本来就"不容易学".不是说它有多难,而是学习它的人,往往都是在学会了其他语言之后,又学java ...

  2. 深入理解javascript原型和闭包(17)——补this

    本文对<深入理解javascript原型和闭包(10)--this>一篇进行补充,原文链接:http://www.cnblogs.com/wangfupeng1988/p/3988422. ...

  3. 深入理解javascript原型和闭包(3)——prototype原型

    既typeof之后的另一位老朋友! prototype也是我们的老朋友,即使不了解的人,也应该都听过它的大名.如果它还是您的新朋友,我估计您也是javascript的新朋友. 在咱们的第一节(深入理解 ...

  4. 深入理解javascript原型和闭包(2)——函数和对象的关系

    上文(理解javascript原型和作用域系列(1)--一切都是对象)已经提到,函数就是对象的一种,因为通过instanceof函数可以判断. var fn = function () { }; co ...

  5. 深入理解javascript原型和闭包

    原文链接http://www.cnblogs.com/wangfupeng1988/p/3977924.html 对象是属性的集合. function show(x) {console.log(typ ...

  6. 深入理解JavaScript原型与闭包

    说明 本文为作者学习记录相关笔记及理解,如有不妥之处,请各位读者积极指出, 虽然标题是深入理解,但可能存在许多不够深入的地方,请各位小伙伴不吝赐教 一切都是对象 一切引用类型都是对象,对象是属性的集合 ...

  7. 深入理解javascript原型和闭包(18)——补充:上下文环境和作用域的关系

    本系列用了大量的篇幅讲解了上下文环境和作用域,有些人反映这两个是一回儿事.本文就用一个小例子来说明一下,作用域和上下文环境绝对不是一回事儿. 再说明之前,咱们先用简单的语言来概括一下这两个的区别. 0 ...

  8. 深入理解javascript原型和闭包(4)——隐式原型

    注意:本文不是javascript基础教程,如果你没有接触过原型的基本知识,应该先去了解一下,推荐看<javascript高级程序设计(第三版)>第6章:面向对象的程序设计. 上节已经提到 ...

  9. 深入理解javascript原型和闭包(6)——继承

    为何用"继承"为标题,而不用"原型链"? 原型链如果解释清楚了很容易理解,不会与常用的java/C#产生混淆.而"继承"确实常用面向对象语言 ...

最新文章

  1. “趣冷淡”怎么看?网络电话寻求共同语言
  2. 【转】Java里如何实现线程间通信
  3. SAP发票校验前收货后是否能更改物料价格
  4. WebAdaptor Object reference not set to an instance of an object.
  5. (转载)【TP5.0】设置session有效时长+修改默认存储路径
  6. 安卓安装之离线搭建Android Studio开发环境
  7. Scrapy中的item是什么
  8. 人工智能python3+tensorflow人脸识别_Tensorflow+opencv2实现人脸识别
  9. 转换大师swf转html,iPixSoft SWF to HTML5 Converter
  10. 大学生计算机知识竞赛,大学生计算机基础知识竞赛题库(试题附答案).docx
  11. 网页设计Dreamweaver【2】
  12. C盘扩容,解决电脑卡顿
  13. 艾司博讯:拼多多怎么设置团长ID?团长权限?
  14. Win7C盘不能扩大怎么办?Win7C盘扩展卷不能点怎么解决
  15. 利用python计算圆球的体积_python计算圆周长、面积、球体体积并画出圆
  16. C语言及程序设计 套餐 课程主页
  17. matlab均方根误差
  18. 90 后美女独家秘籍:从小白到 AI 算法工程师
  19. iOS7 UUID唯一标识
  20. 分享一个Spring MVC 根据图片URL,下载图片的方法

热门文章

  1. SQL SERVER 2005 进行XML查询
  2. 怎么用js调用C#后台方法
  3. Hibernate中常见的异常
  4. Yii的 Yii::$app-end()
  5. mysql 自增列坏处_MySQL--更新自增列的潜在风险
  6. PHP函数库之BC高精确度函数库
  7. mysql server uuids_master and slave have equal MySQL server UUIDs 解决方法
  8. java二维码生成并可以转换
  9. Linux服务器IP下了,linux – DDOS攻击下的服务器 – 如何查找IP?
  10. python列表生成多个号码_python按需生成固定数量电话号码并保存为excel(不重复)...