自己的学习记录,写的短点可以以后短时间内理清一些疑惑,看前要求你至少了解js中关于原型链等基本概念,因为文章直接以总结的形式理出知识点,没有去解释一些基本的概念!

1.1、熟记两句话,预预热

  1. 函数既是函数也是对象,对象通过new关键字从函数中得来,函数自己创造了自己
  2. 对象中有一个未纳入规范的属性(指针)叫proto,函数中有一个属性(指针)叫prototype,proto姑且称它为隐式原型,prototype属性指向的叫原型对象

1.2、函数和对象初探

  1.其他语言中类是基本单位,Object类是所有类的基类。

  2.js中函数成了头等公民,因此在js中函数就是最基本的单位,而函数既是函数也是对象(本文开头),所以我们要分两种情况来探讨此处的“基类”了:Function函数是一个基函数,Object原型对象是所有原型对象的基对象。

1.3、函数和对象究竟谁先有谁?

  在其他语言中实例通过new一个类可以获得,也就是先有类后有对象,这时有些同学就有疑问了,楼主上边提到js的函数既是函数也是对象,对象又是从函数new出来滴,那么函数和对象究竟是谁先有的谁,也就是鸡生蛋还是蛋孵鸡的问题咯~。

  其实这两个问题压根就不应该放在一起来看,首先我们要深刻了解一个约定俗成的规定那就是“js的函数既是函数也是对象”(瞧瞧!开头的话是不是很重要?),这是基础定义。其次,让我们来看下new在js中的真正作用呗!new在其他语言中是实例化一个模板类,也就是类相当于模板是最初写好固定滴,而在js却非也,先来一句官方版的下定义,js中的new改变了this的指向,返回一个继承了该函数原型对象的新对象,this指向了新的实例,综上也就是实例化了一个继承构造函数原型对象的新对象咯,非也啊,不然我还写个毛毛啊~其实new除了上边的功能还做了另外一项伟大的工作叫做——“继承”,其会继承构造函数中带有this的属性。而且函数在js中是可以随时动态添加属性滴,也就是继承过来的属性也是动态习得的——动态继承!js函数本身就可以被当作对象使用。。。额,那要new干毛?当然是js的new比传统语言的多了一层“动态继承”的含义咯!so,其实使用new关键字以后就可以得到一个既有私有属性(来自于this)又继承了该函数原型链上的新对象。既然new有了新层次的作用,那么对象是new出来的,先有对象还是先有函数还会像其他语言中那么重要吗?我用new只是为了拿到最新的对象咯,我用new只是为了更好的封装(私有和公有)一个对象咯,我不用new我照样也会有对象滴,滋滋~~如果你依旧要寻找答案,其实我已经回答了,函数既是函数也是对象他们两个是并列存在的,只是函数和对象在js中的分工作用不同罢了,那他们的具体作用是啥腻?以及到底谁先有谁呢?第二个思路请强迫症的往下瞧瞧吧!

  对new补充:new类似于一个工厂设计模式,其内部通过apply等方法调用了构造函数从而改变其this的指向,获得构造中属于自己的私有属性,并且将自身的__proto__指向构造函数的prototype属性,最后返回这个对象,所以就会造成既私有又“继承”咯!

1.4、聊聊js“本身”中函数和对象的具体作用

  一句话:函数搞一搞私有和封装,对象玩一玩原型链和继承 

  1.其他语言类是基本单位,继承依靠在类中写extends关键字,是类与类之间的单继承

  2.js中函数是基本单位,继承的方式之一是依靠原型链,是?与?之间?“继承”呢?

  so,我们来推敲下吧,原型链上都有啥?嗯对了,原型链上全是对象,其开始可能是某个实例对象,其终点是null(注意:是通常情况下),现在我们是不是就可以将传统语言的类继承说成是js中的对象继承咯?现在有了开篇两句话的基础和我上边的解释我们就不难得出如下推敲了:  
  
  函数方面:函数的prototype——>Object.prototype——>null 

  对象方面:它的proto指针——>构造函数的.prototype——>Function.prototype——>Object.prototype——>null

  答疑:js中函数是基本单位,继承的方式之一是依靠原型链,是原型对象与原型对象之间单继承!那js能实现多继承否?我都提出来了,那你就猜猜呗!

  综上,函数和对象是个啥子关系咯?纵观全文我们发现其“始终如一”啊~函数即是函数也是对象其为始,同时指向了null其为终,现在你还会不会纠结函数和对象谁先有谁咯?

聊聊传统oo和js的某些对比——对象/函数/new关键字等的更多相关文章

  1. 前端测试框架对比(js单元测试框架对比)

    前端测试框架对比(js单元测试框架对比) 本文主要目的在于横评业界主流的几款前端框架,顺带说下相关的一些内容. 测试分类 通常应用会有 单元测试(Unit tests) 和 功能测试(Function ...

  2. jQuery---jq基础了解(语法,特性),JQ和JS的区别对比,JQ和JS相互转换,Jquery的选择器(基础选择器,层级选择器,属性选择器),Jquery的筛选器(基本筛选器,表单筛选器),Jquery筛选方法

    jQuery---jq基础了解(语法,特性),JQ和JS的区别对比,JQ和JS相互转换,Jquery的选择器(基础选择器,层级选择器,属性选择器),Jquery的筛选器(基本筛选器,表单筛选器),Jq ...

  3. JS入门之ActiveXObject对象(转载)

    JS入门之ActiveXObject对象   此对象提供自动化对象的接口.   function ActiveXObject(ProgID : String [, location : String] ...

  4. js中的json对象详细介绍

    JSON一种简单的数据格式,比xml更轻巧,在JavaScript中处理JSON数据不需要任何特殊的API或工具包,下面为大家详细介绍下js中的json对象, 1.JSON(JavaScript Ob ...

  5. [Javascript] js的类和对象

    类 graph LR 类-->构造函数 类-->prototype对象 类-->instanceof运算符 类-->constructor属性 类-->isPrototy ...

  6. 前端分享----JS异步编程+ES6箭头函数

    前端分享----JS异步编程+ES6箭头函数 ##概述Javascript语言的执行环境是"单线程"(single thread).所谓"单线程",就是指一次只 ...

  7. JS面向对象设计-理解对象

    不同于其他面向对象语言(OO,Object-Oriented),JS的ECMAScript没有类的概念, 它把对象定义为"无序属性(基本值.对象.函数)的集合",类似于散列表. 每 ...

  8. Vue.js 2.x render 渲染函数 & JSX

    Vue.js 2.x render 渲染函数 & JSX Vue绝大多数情况下使用template创建 HTML.但是比如一些重复性比较高的场景,需要运用 JavaScript 的完全编程能力 ...

  9. js原生的url操作函数,及使用方法。(附:下边还有jquery对url里的中文解码函数)

    js原生的url操作函数,完善的. /*****************************/ /* 动态修改url */ /*****************************/ var ...

随机推荐

  1. 1.把二元查找树转变成排序的双向链表[BST2DoubleLinkedList]

    [题目]:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向. 比如将二元查找树 . 10 / \ 6 14 / \ / \ 4 8 12 16 转 ...

  2. ios cordite 读取错误CoreData could not fulfill a fault for '0x15b4a870

    解释在这里 http://stackoverflow.com/questions/14296892/nsobjectinaccessibleexception-reason-coredata-coul ...

  3. iOS 动画结束后 view的位置 待完善

    默认的动画属性,动画结束后,view会回到原始位置.但是如果设定了 CAAnimation的 removedOnCompletion 属性,那么view会保持这个位置!但是真实的接收 点击的frame ...

  4. iptables之链之间的跳转

    创建一个新的链     按照管理,用户自定义的链用小写来区分它们 iptables -N newchain 可以在这个链的尾部跳转到INPUT链 iptables -A newchain -j INP ...

  5. 3.js模式-策略模式

    1. 策略模式 策略模式定义一系列的算法,把它们封装起来,并且可以互相替换. var strategies = { isNonEmpty: function(value,errMsg){ if(val ...

  6. Django~Excel,PDF

    # Text file #response = HttpResponse(mimetype='text/plain')  #response['Content-Disposition'] = 'att ...

  7. Valentine's Day Round 1001.Ferries Wheel(hdu 5174)解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5174 题目意思:给出 n 个人坐的缆车值,假设有 k 个缆车,缆车值 A[i] 需要满足:A[i−1] ...

  8. 自定义循环滑动的viewpager

    今天和大家分享一下如何定制一个可以循环滑动的viewpager.其实今天更重要的提供一种组件化思想,当然你可以理解为面向对象思想. 吐槽一下网上流行的实现方式吧(为了方便说明,下文称之为方式A),方式 ...

  9. 【leetcode】Spiral Matrix(middle)

    Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral or ...

  10. odoo注销后在登录时的用户名和密码

    初识odoo时会遇到注销后无法登陆的情况,一般原因是没有留意管理员邮件地址和对应的密码所致.初始情况下默认的邮件地址为admin,密码为数据库创建时提供的密码.