javascript原型深入解析2--Object和Function,先有鸡先有蛋
1.提出两个问题:
- Js 的prototype和__proto__ 是咋回事?
- 先有function 还是先有object?
2.引用《JavaScript权威指南》的一段描述:
每个JS对象一定对应一个原型对象(__proto__指向的),并从原型对象继承属性和方法。
function Person(){
this.live = true;
}
var sy = new Person();
console.info(sy.__proto__ === Person.prototype) // true
Cat = {};
console.info(Cat.__proto__ === Object.prototype) // true
Dog = new Object();
console.info(Dog.__proto__ === Object.prototype) // true
又来一个问题:
Object 是js中的最原始的对象吗?Object.prototype是什么?
3.先谈prototype
只有函数才有prototype属性。
JS不像其它面向对象的语言,它没有类(class,ES6引进了这个关键字,但更多是语法糖)的概念。JS通过函数来模拟类。

当你创建(定义)函数Person时,JS会为这个函数自动添加prototype属性,其是Object类型对象,并且包含constructor和__proto__。
而一旦你把这个函数当作构造函数(constructor)调用(即通过new关键字调用),那么JS就会帮你创建该构造函数的实例sy,实例继承构造函数prototype的所有属性和方法(实例通过设置自己的__proto__指向承构造函数的prototype来实现这种继承)。
对象的__proto__指向自己构造函数的prototype。sy.__proto__.__proto__...的原型链由此产生,包括我们的操作符instanceof正是通过探测obj.__proto__.__proto__... === Constructor.prototype来验证sy是否是Person或者Object的实例。
4.函数和对象之间的关系(重点)
创建个函数有两种方式:
(1)
var foo = new Function ([arg1[, arg2[, ...argN]],] functionBody)
(2)
function foo() {} // var foo = function(){}
深入分析函数:
函数也是对象,是一个Function实例(Function就像是python中的元类的角色),我们称函数是特殊的对象(只有函数有prototype)。
因此每个函数对象都继承Function的原型对象,Person.__proto__ 指向Function.prototype。下面两个黑框是同一个内存对象


给出两个判断:
Object instanceof Function // true
Function instanceof Object // true
Function是函数的起源,那Function本身是什么呢?
Object又是什么呢,先有Object还是先有Function
乱了。。。。。
上关系图来分析吧。

再来看个js开天劈地的伪代码
var ObjectPrototype = create( ); // 开天辟地 var FunctionPrototype = create( ObjectPrototype );
//FunctionPrototype(后被赋值给了Function.prototype)是Object类型的
//因为其原型是ObjectPrototype var Function = create( FunctionPrototype ); Function.prototype = FunctionPrototype;
// Function是Function类型的,也是Object类型的
//言外之意,Function对象 原型链上有Function.prototype和Object.prototype Object = create( FunctionPrototype ); Object.prototype = ObjectPrototype;
//Object是Function类型的,也是Object类型的
//言外之意Object对象的原型链上有Function.prototype和Object.prototype
- 先有了Object.prototype,
- 然后有Function.prototype,
- 然后有了Function,
- 然后创建了Object,
- Object的原型又指向了Object.prototype,构成了循环指向;
从而出现了鸡和蛋的问题。
所以严格来说先有Function再有Object。
但是又先有的Object原型,再有的Function原型。
Object.prototype.__proto__ === null,说明原型链到Object.prototype终止
- Person是Function创建出来的函数,Person.prototype是个Object对象,Person.proyotype.__proto__指向Object.prototype
- Function是js自带的对象,可以创建函数的函数,所以Function.prototype指向的函数根源,所有创建的函数的__proto__都指向Function.prototype。给Object原型添加方法,Function也会有该方法,因为Function.prototype 指向Object.prototype。
- Object是js自带的对象,算基类; Object本身又是通过Function定义出来的,所以会受到Function影响。
- Function只管函数,Object什么都管。

可以发现黑框的Object不是普通的Object,而是原始天尊
javascript原型深入解析2--Object和Function,先有鸡先有蛋的更多相关文章
- javascript原型深入解析1-prototype 和原型链、js面向对象
1.用prototype 封装类 创建的每个函数都有一个prototype(原型属性),他是个指针,指向的对象,这个对象的用途就是包含了这个类型所有实例共享的属性和方法. 回味这句,想想java或者C ...
- JavaScript原型链以及Object,Function之间的关系
JavaScript里任何东西都是对象,任何一个对象内部都有另一个对象叫__proto__,即原型,它可以包含任何东西让对象继承.当然__proto__本身也是一个对象,它自己也有自己的__proto ...
- 前端笔记之JavaScript面向对象(一)Object&函数上下文&构造函数&原型链
一.对象(Object) 1.1 认识对象 对象在JS中狭义对象.广义对象两种. 广义:相当于宏观概念,是狭义内容的升华,高度的提升,范围的拓展.狭义:相当于微观概念,什么是“狭”?因为内容狭隘具体, ...
- Javascript Object、Function对象
1.Object对象 原型对象 原型是对象的一个属性,也就是prototype属性,每个对象都有这个内部属性,而且他本身也是一个对象. <script type="text/javas ...
- JavaScript中你所不知道的Object(二)--Function篇
上一篇(JavaScript中你所不知道的Object(一))说到,Object对象有大量的内部属性,而其中多数和外部属性的操作有关.最后留了个悬念,就是Boolean.Date.Number.Str ...
- javascript的 Object 和 Function
一. javascript 的 内置对象: Object 和 Function javascript所有东西,包括 Function 都是对象 . Array 其实是一个 Function 类型的对 ...
- 从Object和Function说说JS的原型链
ECMAScript规定了两个特殊的内置对象:Object和Function.他们的特殊性在于,他们本身既是对象又是函数,而他们同时也是对象和函数的构造器.这种自己生自己的逻辑显然违反人性,如果还停留 ...
- 从var func=function 和 function func()区别谈Javascript的预解析机制
var func=function 和 function func()在意义上没有任何不同,但其解释优先级不同:后者会先于同一语句级的其他语句. 即: { var k = xx(); function ...
- Jascript原型链以及Object和Function之间的关系
先看一个简单的function变量 function fun1(name) { this.name = name; } console.log("fun1", fun1) 从结果可 ...
随机推荐
- 【JavaScript】内部与外部引入方式
1.内部引入方式: script的type属性默认为"text/javascript",可以不写 <script type="text/javascript&quo ...
- Latex使用过程中的一些总结
本文主要总结在使用Latex过程中遇到的一些问题及解决方案. 一:关于参考文献 1.如何在paper同一处用\cite命令同时引用多篇文献? 用\cite{bibtex1}\cite{bibtex2} ...
- mysql在windows下安装(含客户端工具)
下载 http://dev.mysql.com/downloads/ 安装 在出现选择安装类型的窗口中,有“typical(默认)”.“Complete(完全)”.“Custom(用户自定义)”三个选 ...
- 【java异常】org.springframework.web.util.NestedServletException: Handler processing failed;Can't connect to X11 window server using 'localhost:10.0' as the value of th
tomcat工程中创建二维码失败.抛出异常Can't connect to X11 window server using 'localhost:10.0' as the value of th 因为 ...
- 07_LACP负载分担(数通华为)
1. 网络拓扑 2. SW1配置:[SW1]vlan batch 10 20[SW1]interface GigabitEthernet 0/0/1[SW1-GigabitEthernet0/0/1] ...
- 说几条JavaScript的基本规范
1.不要在同一行声明多个变量 2.使用===或!==来比较 3.使用字面量的方式来创建对象.数组,替代new Array这种形式 4.不要使用全局函数 5.switch语句必须要带default分支 ...
- 洛谷P1531 I Hate It题解
题目背景 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感. 题目描述 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的 ...
- 11-散列3 QQ帐户的申请与登陆 (25 分)
实现QQ新帐户申请和老帐户登陆的简化版功能.最大挑战是:据说现在的QQ号码已经有10位数了. 输入格式: 输入首先给出一个正整数N(≤10^5),随后给出N行指令.每行指令的格式为:“命令符(空 ...
- python总结八
1.range的使用讲解: 首先呢如果只是一个参数的话,那么就是循环遍历这个参数递增,例如 range(5)>>[1,2,3,4] 如果是两个参数的话,且注意后面的第二个参数要比第一个大, ...
- 请教网友:#pragma pack(push) #pragma pack(pop)无效
//try 一 try #pragma back(push) #pragma pack(2) struct E { char a; short b; double c; float d; char e ...