对于JavaScript对象的prototype和__proto__的理解
一、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__的理解的更多相关文章
- javascript中的prototype和__proto__的理解
在工作中有时候会看到prototype和__proto__这两个属性,对这两个属性我一直比较蒙圈,但是我通过查阅相关资料,决定做一下总结加深自己的理解,写得不对的地方还请各位大神指出. 跟__prot ...
- JavaScript原型链:prototype与__proto__
title: 'JavaScript原型链:prototype与__proto__' toc: false date: 2018-09-04 11:16:54 主要看了这一篇,讲解的很清晰,最主要的一 ...
- JavaScript中的prototype和__proto__细致解析
最近在学js,体会了一点点它的灵活性.对于初学者的我,总是被它的灵活感到晕头转向,最近发现了一点东西想与大家分享. JavaScript中的prototype和_proto_: 我们先了解一点js中的 ...
- Javascript中的prototype和__proto__的联系区别
转载至http://www.cnblogs.com/sinstone/p/5136871.html 一.联系 prototype和__proto__都指向原型对象,任意一个函数(包括构造函数)都有 ...
- 对象中prototype与__proto__与从cinstructor的作用和区别
首先先要知道prototype什么时间才会有 只有在创建函数的时候,每当函数创建的时候才会原型prototype,还有一个constructor,这个不是函数独有的,对象也有 下面就来说说对象prot ...
- <JavaScript>constructor、prototype、__proto__和原型链
在看了网上很多相关的文章,很多都是懵逼看完,并不是说各位前辈们写得不好,而是说实在不容易在一两次阅读中理解透.我在阅读了一些文章后,自己整理总结和绘制了一些相关的图,个人认为会更容易接受和理解,所以分 ...
- javascript的构造函数和实例对象、prototype和__proto__的区别,原型对象及构造器的理解
一.前言 我们先通过代码来分别打印出实例对象.构造函数,以及修改了原型对象的构造函数,通过对比内部结构来看看他们之间的区别. //定义构造函数 function Person(name, age){ ...
- 彻底理解JavaScript中的prototype、__proto__
虽然在JavaScript里一切皆对象,但为了理解原型链系统,我们需要将JavaScript的对象分为对象和函数两大类.在此基础上,JavaScript的原型链逻辑遵从以下通用规则: 对象有__pro ...
- JavaScript 中 的prototype和__proto__
1.prototype是函数的一个属性(每个函数都有一个prototype属性),这个属性是一个指针,指向一个对象.它是显示修改对象的原型的属性. 2.__proto__是一个对象拥有的内置属性(请注 ...
随机推荐
- 使用Android平板编程,执行linux命令
android有一些应用支持开发, AIDE 介绍http://www.wandoujia.com/apps/com.aide.ui https://play.google.com/store/app ...
- Flask学习记录之Flask-Admin
相信用过Django框架的都不会忘记它强大的Admin功能,Flask-admin是一款能够与Django Admin所媲美的扩展,能够快速创建Web管理界面,实现了用户.文件增删改查等常用功能:也可 ...
- CSS太阳月亮地球三角恋旋转效果
纯粹玩一下,好像没有什么实际的卵用,but,纯玩买不了上当,纯玩买不了受骗........ 地月旋转的一个css效果,无聊玩玩,可以复制到记事本试试 <!DOCTYPE html>< ...
- VC中如何获取当前时间(精度达到毫秒级)
标 题: VC中如何获取当前时间(精度达到毫秒级)作 者: 0xFFFFCCCC时 间: 2013-06-24链 接: http://www.cnblogs.com/Y4ng/p/Millisecon ...
- Selenium2Library+ride学习笔记
一.环境部署 1.安装python2.7编译环境.ride环境以及Selenium2Library环境,环境部署可参见前面几节. 2.启动RIDE编译环境,导入Selenium2Library库. ...
- 破解官方recovery的签名验证
步骤简述1.解包recovery.img,2.反编译/sbin/recovery,用ida64plus3.在反编译出来的文本中查找:signature 4.简单的看一下指令流程,CBZ下面是faile ...
- HTTP断点续传(分块传输)(HTTP头格式非常清楚)
简述 断点续传:指的是在上传/下载时,将任务(一个文件或压缩包)人为的划分为几个部分,每一个部分采用一个线程进行上传/下载,如果碰到网络故障,可以从已经上传/下载的部分开始继续上传/下载未完成的部分, ...
- 学习javascript基础知识系列第二节 - this用法
通过一段代码学习javascript基础知识系列 第二节 - this用法 this是面向对象语言中的一个重要概念,在JAVA,C#等大型语言中,this固定指向运行时的当前对象.但是在javascr ...
- 1645: [Usaco2007 Open]City Horizon 城市地平线
1645: [Usaco2007 Open]City Horizon 城市地平线 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 315 Solved: ...
- ubuntu记录
1. gleboneblack OMAPES=4.x ANDROID_ROOT_DIR=$HOME/aosp W=1 install /bin/sh: 5: ./install.sh: Permiss ...