深入理解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。

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

注:
 1. typeof操作符是确定一个变量是字符串、数组、布尔值,还是undefined的最佳工具;
 2. 如果变量的值是一个对象或者null,则typeof操作符会返回“object”;
 3. 通常,我们并不想知道某个值是对象,而是想知道它是什么类型的对象。使用instanceof操作符可以做到。Result=variable instanceof constructor 如果变量是给定引用类型的实例,那么instanceof操作符就会返回true;如果使用instanceof操作符检测基本类型的值,则该操作符始终会返回false,因为基本类型不是对像。

  那么在javascript中的对象,到底该如何定义呢?
  答:对象——若干属性的集合。
  java或者C#中的对象都是new一个class出来的,而且里面有字段、属性、方法,规定的非常严格。但是javascript就比较随意了——数组是对象,函数是对象,对象还是对象。对象里面的一切都是属性,只有属性,没有方法。那么这样方法如何表示呢?——方法也是一种对象。因为它的属性表示为键值对的形式。
  例子1:

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

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

 var fn = function () {
            alert(100);
        };
        fn.a = 10;
        fn.b = function () {
            alert(123);
        };
        fn.c = {
            name: "haha",
            year: 1993
        };

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

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

  验明正身!的确是个函数。那么咱们常用的 $.trim() 也是个函数,经常用,就不用验了吧!很明显,这就是在$或者jQuery函数上加了一个trim属性,属性值是函数,作用是截取前后空格。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值