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

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

这张图有多少人能看的懂?一般没有很强钻研精神的前端开发者来说,没个三年工作经验都不能清楚的把这个原理一一道来,想分析彻底这张图,只能一个一个知识点来进行分析

本文开头是一切皆对象

首先咱们还是先看看javascript中一个常用的函数——typeof()

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

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)都是对象。他们都是引用类型。

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

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

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

javascript比较随意——数组是对象,函数是对象,对象还是对象。对象里面的一切都是属性,只有属性,没有方法。那么这样方法如何表示呢?——方法也是一种属性。因为它的属性表示为键值对的形式。

而且,更加好玩的事,javascript中的对象可以任意的扩展属性,没有class的约束。这个大家应该都知道,就不再强调了。

先说个最常见的例子:


var obj = {
    name : "ziksang",
    b : {
        height : 101,
        width : 292
    }
}

以上代码中,obj是一个自定义的对象,其中name ,b就是它的属性,而且在b的属性值还是一个对象,它又有height、width两个属性。

这个可能比较好理解,那么函数和数组也可以这样定义属性吗?——当然不行,但是它可以用另一种形式,总之函数/数组之流,只要是对象,它就是属性的集合。

以函数为例子:

  var fn = function () {
            alert(100);
        };
        fn.a = 10;
        fn.b = function () {
            alert(123);
        };
        fn.c = {
            name: "周志祥",
            year: 111111
        };

上段代码中,函数就作为对象被赋值了a、b、c三个属性——很明显,这就是属性的集合吗。

你问:这个有用吗?

回答:可以看看jQuery源码!

在jQuery源码中,“jQuery”或者“$”,这个变量其实是一个函数,不信你可以叫咱们的老朋友typeof验证一下。

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

验明正身!的确是个函数。那么咱们常用的 $.trim() 也是个函数,经常用,就不用验了吧!

很明显,这就是在$或者jQuery函数上加了一个trim属性,属性值是函数,作用是截取前后空格。

最后,有个疑问。在typeof的输出类型中,function和object都是对象,为何却要输出两种答案呢?都叫做object不行吗?——当然不行。

具体原因,且听下回分解!

    原文作者:Ziksang
    原文地址: https://www.jianshu.com/p/4b16c341033a
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞