深刻理解javascript原型和闭包(1)——一切都是对象

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

——固然,也不是全部的都是对象,值类型就不是对象。html

 

首先我们仍是先看看javascript中一个经常使用的运算符——typeof。typeof应该算是我们的老朋友,还有谁没用过它?前端

typeof函数输出的一共有几种类型,在此列出:java

       function show(x) {

            console.log(typeof x);    // undefined
            console.log(typeof 10);   // number
            console.log(typeof 'abc'); // string
            console.log(typeof true);  // boolean

            console.log(typeof function () {});  //function

            console.log(typeof [1, 'a', true]);  //object
            console.log(typeof { a: 10, b: 20 });  //object
            console.log(typeof null);  //object
            console.log(typeof new Number(10));  //object
        }
        show();

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

判断一个变量是否是对象很是简单。值类型的类型判断用typeof,引用类型的类型判断用instanceof。面试

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

 

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

对象——若干属性的集合。数组

java或者C#中的对象都是new一个class出来的,并且里面有字段、属性、方法,规定的很是严格。可是javascript就比较随意了——数组是对象,函数是对象,对象仍是对象。对象里面的一切都是属性,只有属性,没有方法。那么这样方法如何表示呢?——方法也是一种属性。由于它的属性表示为键值对的形式。闭包

并且,更加好玩的事,javascript中的对象能够任意的扩展属性,没有class的约束。这个你们应该都知道,就再也不强调了。app

先说个最多见的例子:

以上代码中,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原型和闭包》的目录,更多内容可参见《深刻理解javascript原型和闭包》。

另外,欢迎关注个人微博

学习做者教程:《前端JS高级面试》《前端JS基础面试题》《React.js模拟大众点评webapp》《zepto设计与源码分析》《json2.js源码解读

相关文章
相关标签/搜索