你的位置:首页 > Java教程

[Java教程]聊聊传统oo和js的某些对比——对象/函数/new关键字等


  自己的记录文章,可以帮大家分分钟内理清一些疑惑,但要求你至少了解一门传统的面向对象语言以及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其为终,现在你还会不会纠结函数和对象谁先有谁咯?