一、Object和Function的关系:

刚学JavaScript的时候,看书上说JavaScript中万物皆对象,而javascript中的其他对象都是从Object继承而来,包括内置对象。瞬间觉得Object碉堡了!

后来,又认识了Function,才知道原来Function才是隐藏在幕后的大BOSS,Object只不过是个大师兄。

Object和Function都是JS自带的函数对象,Function比较牛逼点,因为它是Object的构造函数,而且Object的__proto__属性指向它的prototype,这意味着Object的那点玩意儿还是从它这里继承的。

Object.constructor === Function; //true
Object.__proto__ === Function.prototype; //true Function.prototype.duang = function(str){console.log(str+"真duang啊!")}; Object.duang("你的头发");
//你的头发真duang啊! Object instanceof Function //true

然而后来我又发现“javascript中的其他对象都是从Object继承而来”这句话其实是错的,准确的说法应该是:“javascript中的其他对象都继承了Object.prototype中的属性和方法

Function.prototype.duang = function(str){console.log(str+"真duang啊!")};
Object.duang("你的头发"); var of = {};
of.duang("猫咪");
// 你的头发真duang啊!
//Uncaught TypeError: of.duang is not a function(…)(anonymous function) Function.prototype.duang = function(str){console.log(str+"真duang啊!")};
Object.prototype.duang = Function.prototype.duang; var of = {}; of.duang("猫咪"); //猫咪真duang啊!

二、普通对象和函数对象:

JavaScript中万物皆对象,但对象之间也是有区别的。分为函数对象和普通对象。

函数对象可以创建普通对象,普通对象没法创建函数对象,普通对象JS世界中最低级的小喽啰,啥特权也没有。

凡是通过new Function创建的对象都是函数对象,其他都是普通对象(通常通过Object创建),可以通过typeof来判断。

function f1(){};
typeof f1 //"function" var o1 = new f1();
typeof o1 //"object" var o2 = {};
typeof o2 //"object"

定义一个函数或函数表达式时,是使用Function方法去创建的,所以创建出来的都是函数对象;
var f1 = function(){} 或 function f1(){}的创建过程都是:

var f1 = new Function(); 

三、原型与各方面的关系:

原型就是其构造函数的一个普通实例对象。

对于任何一个普通的函数f1:function f1(){};

f1.prototype 就是f1的一个实例对象,因为它不是一个函数声明或函数表达式,所以它是通过new它的构造函数创建的,
是通过Object创建的,所以它是普通对象。

一个函数的prototype的创建过程如下:

var temp1 = new f1();
f1.prototype = temp1;

但Function的原型不一样,它是一个函数对象,因为它的构造函数是Function,它通过Function创建,所以它是函数对象!
它的创建过程如下:

var temp = new Function();
Function.prototype = temp;

f1.prototype其他关系如下:

f1.prototype.constractor === f1;

f1.prototype.__proto__ === Object.prototype;

f1.prototype.__proto__.constractor === Object;

f1.prototype.constractor.prototype = f1.prototype;

f1.prototype.__proto__.constructor.prototype === f1.prototype.__proto__ === Object.prototype

这里需要特别注意的是:

1、Object.prototype.__proto__ === null;

2、Object.__proto__ === Function.prototype
Object是函数对象,是通过new Function()创建,所以Object.__proto__指向 
Function.prototype。

3、Function.__proto__ === Function.prototype
Function 也是对象函数,也是通过new Function()创建,所以 
Function.__proto__指向Function.prototype。

自己是由自己创建的,好像不符合逻辑,但仔细想想,现实世界也有些类似,你是 
怎么来的,你妈生的,你妈怎么来的,你姥姥生的,……类人猿进化来的,那类人 
猿从哪来,一直追溯下去……,就是无,(NULL生万物)
正如《道德经》里所说“无,名天地之始”。

4、Function.prototype.__proto__ === Object.prototype

其实这一点我也有点困惑,不过也可以试着解释一下。
Function.prototype是个函数对象,理论上他的__proto__应该指向 
Function.prototype,就是他自己,自己指向自己,没有意义。
JS一直强调万物皆对象,函数对象也是对象,给他认个祖宗,指向 
Object.prototype。Object.prototype.__proto__ === null,保证原型链能够正 
常结束。

对于JavaScript对象的prototype和__proto__的理解的更多相关文章

  1. javascript中的prototype和__proto__的理解

    在工作中有时候会看到prototype和__proto__这两个属性,对这两个属性我一直比较蒙圈,但是我通过查阅相关资料,决定做一下总结加深自己的理解,写得不对的地方还请各位大神指出. 跟__prot ...

  2. JavaScript原型链:prototype与__proto__

    title: 'JavaScript原型链:prototype与__proto__' toc: false date: 2018-09-04 11:16:54 主要看了这一篇,讲解的很清晰,最主要的一 ...

  3. JavaScript中的prototype和__proto__细致解析

    最近在学js,体会了一点点它的灵活性.对于初学者的我,总是被它的灵活感到晕头转向,最近发现了一点东西想与大家分享. JavaScript中的prototype和_proto_: 我们先了解一点js中的 ...

  4. Javascript中的prototype和__proto__的联系区别

    转载至http://www.cnblogs.com/sinstone/p/5136871.html   一.联系 prototype和__proto__都指向原型对象,任意一个函数(包括构造函数)都有 ...

  5. 对象中prototype与__proto__与从cinstructor的作用和区别

    首先先要知道prototype什么时间才会有 只有在创建函数的时候,每当函数创建的时候才会原型prototype,还有一个constructor,这个不是函数独有的,对象也有 下面就来说说对象prot ...

  6. <JavaScript>constructor、prototype、__proto__和原型链

    在看了网上很多相关的文章,很多都是懵逼看完,并不是说各位前辈们写得不好,而是说实在不容易在一两次阅读中理解透.我在阅读了一些文章后,自己整理总结和绘制了一些相关的图,个人认为会更容易接受和理解,所以分 ...

  7. javascript的构造函数和实例对象、prototype和__proto__的区别,原型对象及构造器的理解

    一.前言 我们先通过代码来分别打印出实例对象.构造函数,以及修改了原型对象的构造函数,通过对比内部结构来看看他们之间的区别. //定义构造函数 function Person(name, age){ ...

  8. 彻底理解JavaScript中的prototype、__proto__

    虽然在JavaScript里一切皆对象,但为了理解原型链系统,我们需要将JavaScript的对象分为对象和函数两大类.在此基础上,JavaScript的原型链逻辑遵从以下通用规则: 对象有__pro ...

  9. JavaScript 中 的prototype和__proto__

    1.prototype是函数的一个属性(每个函数都有一个prototype属性),这个属性是一个指针,指向一个对象.它是显示修改对象的原型的属性. 2.__proto__是一个对象拥有的内置属性(请注 ...

随机推荐

  1. MySQL Left Join,Right Join

    魂屁,东西发这里了关于Left Join,Right Join的 在讲MySQL的Join语法前还是先回顾一下联结的语法,呵呵,其实连我自己都忘得差不多了,那就大家一起温习吧(如果内容有错误或有疑问, ...

  2. set{变量 = value;}get{return 变量;}

    形如: public string _customValue        {            set { _customValue = value; }            get { re ...

  3. 关于把A表中的数据复制到B表中。

    最近公司需要把sql中的数据给整理出来,这就牵涉到数据转移问题. 我平时是很少接触sql这一块的.所以碰到这个问题甚是伤脑筋. 不过还好,这问题并不像我想象中的那么的困难. 以前做过把数据插入到临时表 ...

  4. 【杭州图铭科技有限公司招募贴】——“JUST DO IT”

    I'm convinced that the only thing that kept me going was that I loved what I did. ——Steve Paul Jobs( ...

  5. windows系统各版本 各种数据结构

    极爽啊http://msdn.moonsols.com/

  6. hibernate 对 sql server 2005 分页改进

    Hibernate 可以实现分页查询 如下 Query q = session.createQuery("from Cat as c"); q.setFirstResult(100 ...

  7. 一个session已经ACTIVE20多小时,等待事件SQL*Net more data from client

    问题描述: 一个session已经ACTIVE20多小时,等待事件SQL*Net more data from client 有一人session,从昨天上午11点多登陆(v$session.logi ...

  8. java 面试基础典型题及答案

    1.switch能否作用在byte.int.long.String? 答案:switch能作用在byte.int.enum常量, 补充:jdk7可以作用在String上 2.short s = 1; ...

  9. Java中判断集合类为空的方法

    *****需要引入Spring的核心Jar包***** 工具类: org.springframework.util.CollectionUtils 方法: public static boolean ...

  10. Django之Cookie与Session

    一.cookie 1.cookie使用 def cookie(request): print(request.COOKIES) # 获取所有的COOKIES obj = render(request, ...