当前位置: 首页 > news >正文

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

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

——当然,也不是所有的都是对象,值类型就不是对象。

 

首先咱们还是先看看javascript中一个常用的运算符——typeof。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

 

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

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

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

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

先说个最常见的例子:

以上代码中,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源码解读》

转载于:https://www.cnblogs.com/wangfupeng1988/p/3977987.html

相关文章:

  • ZStack--级联框架
  • 关于安卓通过webservice访问数据库问题
  • 从上万监控到实时示警 浙江绍兴餐饮迎智能“食代”
  • win8.1 virtualbox 安装centos7注意事项
  • Java虚拟机在执行程序时内存划分的区域都有哪些?
  • 常见MQTT服务器搭建与试用
  • glutBitmapCharacter及glBitmap在ATI显卡下无法正常显示的原因初探
  • 俄罗斯“光影魔术”展亮相上海科技馆
  • AsyncTasLoader不进行加载操作的原因及解决方法
  • 一文详解Python字符串条件判断方法
  • 前端 CSS 规范
  • SpringBoot 实战 (三) | 配置文件详解
  • 搜索分词---产生新词的公式
  • ORA-22813 ORA-06512
  • MySQL 服务启动y异常: 本地无法启动MySQL服务,报的错误:1067,进程意外终止---解决...
  • CSS实用技巧
  • GraphQL学习过程应该是这样的
  • Java多线程(4):使用线程池执行定时任务
  • Js基础——数据类型之Null和Undefined
  • Node 版本管理
  • python大佬养成计划----difflib模块
  • Spring Boot快速入门(一):Hello Spring Boot
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 初识 webpack
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 前端面试之闭包
  • 深度学习在携程攻略社区的应用
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 跳前端坑前,先看看这个!!
  • 详解NodeJs流之一
  • 异步
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 正则表达式-基础知识Review
  • ​flutter 代码混淆
  • ​ssh免密码登录设置及问题总结
  • ​如何在iOS手机上查看应用日志
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (SpringBoot)第七章:SpringBoot日志文件
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)springboot教学评价 毕业设计 641310
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (一)Java算法:二分查找
  • (一一四)第九章编程练习
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • (转载)深入super,看Python如何解决钻石继承难题
  • **CI中自动类加载的用法总结
  • .Net Web项目创建比较不错的参考文章
  • .net 程序发生了一个不可捕获的异常
  • .Net 路由处理厉害了
  • .net 微服务 服务保护 自动重试 Polly
  • .net 中viewstate的原理和使用
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • @Not - Empty-Null-Blank
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节
  • [AI]文心一言出圈的同时,NLP处理下的ChatGPT-4.5最新资讯