通过构造函数F创建的对象实例p 这个对象p的原型对象是 构造函数中prototype属性指向的对象s,
这个对象p中也有个非标准的__proto__属性指向构造函数prototype属性
所指向的对象s,所以就有 p.__proto__ === F.prototype;
在对象P的原型对象s中有个属性constructor属性,指向的是构造函数本身。
如果对象p的原型对象s被重写,那么P的构造函数不再是F,而是Object

例如:

 function F(){};
var p = new F();
console.log(p.__proto__ === F.prototype)//true
console.log(p.constructor === F) //true
console.log(p instanceof F) //true
F.prototype = {};//重写原型对象
p2 = new F() //重新实例一个对象p2
console.log(p instanceof F,p2 instanceof F) //false,true instanceof运算符返回一个布尔值,
 //instanceof运算符可以用来判断某个构造函数的prototype属性是否存在另外一个要检测对象的原型链上。
//instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上。 /*
Instanceof的判断队则是:沿着A的__proto__这条线来找,同时沿着B的prototype这条线来找,如果两条线能找到同一个引用,即同一个对象,那么就返回true。如果找到终点还未重合,则返回false。 */
console.log(p.constructor === F) //true
console.log(p2.constructor === F)//false
console.log(p2.constructor === Object)//true
//我们重写F.prototype的时候,并没有改变p1属性prototype的指向,它指向的还是老的那个F.prototype 对象
//原型的动态性 强调的前提是同一个原型对象,即对象(p1)指向的原型对象和类(F)指向的原型对象是同一个,
//当发生原型对象重写的时候,实际上是有个两个原型对象的,一个新的,一个老的。

instanceof 复杂用法:

function Ben() {}
console.log(Object instanceof Object); //true
console.log(Function instanceof Function); //true
console.log(Function instanceof Object); //true
console.log(Ben instanceof Function); //true
console.log(String instanceof String); //false
console.log(Boolean instanceof Boolean); //false
console.log(Ben instanceof Ben); //false

在这里构造函数F也是对象,所以F也有原型对象s2,F的原型对象s2 是 构造函数Function中原型属性prototype所指向的原型对象s2;

Function函数也是对象所以,Function函数的构造函数也是Function...因此所有函数都是由Function构造函数的实例(包括function Object(){})

Function的原型属性prototype指向的对象和Function的原型对象__proto__ 指向的对象相等 并且Function.__proto__对象是一个特殊的函数对象,

不具有prototype属性

 console.log(F.__proto__ === Function.prototype)//true
console.log(Function.__proto__ === Function.prototype) //true function(){}
console.log(Function.__proto__.__proto__ === Object.prototype)//true
console.log(Object.prototype.__proto__ === null)//true

对象字面量产生的对象连接到Object.prototype。函数对象连接到Function.prototype(该原型对象本身连接到Object.prototype).

最后一张图理解Object和Function

(转):

一句话简单理解javascript中的原型对象的更多相关文章

  1. 简单理解javascript中的原型对象,实现对之间共享属性和行为

    javascript中提供了构造函数.可以方便的创建对象. 典型的构造函数例如以下: function Person(name, age) { this.name = name; this.age = ...

  2. 理解JavaScript中的原型继承(2)

    两年前在我学习JavaScript的时候我就写过两篇关于原型继承的博客: 理解JavaScript中原型继承 JavaScript中的原型继承 这两篇博客讲的都是原型的使用,其中一篇还有我学习时的错误 ...

  3. 理解javascript中的原型模式

    一.为什么要用原型模式. 早期采用工厂模式或构造函数模式的缺点:  1.工厂模式:函数creatPerson根据接受的参数来构建一个包含所有必要信息的person对象,这个函数可以被无数次的调用,工厂 ...

  4. 如何理解JavaScript中的原型和原型链

    首先是一张关系图,避免抽象化理解时产生的困难 Function对象 函数对象是JavaScript学习中不可避免的一部分,而且这一部分相对重要且抽象 函数的创建方式有2种: 字面量创建 var foo ...

  5. 深入理解javascript构造函数和原型对象

    ---恢复内容开始--- 对象,是javascript中非常重要的一个梗,是否能透彻的理解它直接关系到你对整个javascript体系的基础理解,说白了,javascript就是一群对象在搅..(哔! ...

  6. javascript中的原型对象

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 简单理解Javascript中的call 和 apply

    javascript中面向对像的能力是后来加进来的, 为了兼容性, 所以整出了很多奇特的东西, function Animal(){ this.name = "Animal"; t ...

  8. 理解JavaScript中的window对象

    前言 每个JavaScript环境都有一个全局对象(global object).在全局范围内创建的任何变量实际上都是这个对象的属性,而任何函数都是它的方法.在浏览器环境中,全局对象是window对象 ...

  9. 彻底理解javascript 中的事件对象的pageY, clientY, screenY的区别和联系。

    说到底, pageY, clientY, screenY的计算,就是要找到参考点, 它们的值就是: 鼠标点击的点----------- 和参考点指点----------的直角坐标系的距离 stacko ...

随机推荐

  1. CSS中的overflow属性

    导读:overflow属性一般用来隐藏超过div范围的元素,包括不隐藏(visible),直接隐藏(hidden),用滚动条隐藏(scroll),自动(aotu)这四个属性.当然overflow的用法 ...

  2. java中使用jxl导出Excel表格详细通用步骤

    该方法一般接收两个参数,response和要导出的表格内容的list. 一般我们将数据库的数据查询出来在页面进行展示,根据用户需求,可能需要对页面数据进行导出. 此时只要将展示之前查询所得的数据放入s ...

  3. timus 1175. Strange Sequence 解题报告

    1.题目描述: 1175. Strange Sequence Time limit: 1.0 secondMemory limit: 2 MB You have been asked to disco ...

  4. php中环境变量

    $_ENV $_ENV是一个包含服务器端环境变量的数组.它是PHP中一个超级全局变量,我们可以在PHP 程序的任何地方直接访问它.   $_ENV只是被动的接受服务器端的环境变量并把它们转换为数组元素 ...

  5. java htmlunit 抓取网页数据

    WebClient webClient=new WebClient(BrowserVersion.CHROME); webClient.setJavaScriptTimeout(5000); webC ...

  6. Selenium-xpath详解

    1.XPATH是什么 XPATH是一门在XML文档中查找信息的语言,XPATH可用来在XML文档中对元素和属性进行遍历,主流的浏览器都支持XPATH,因为HTML页面在DOM中表示为XHTML文档.X ...

  7. 数据库为什么要用B+树结构--MySQL索引结构的实现

    原理: http://blog.csdn.net/cangchen/article/details/44818485 http://blog.csdn.net/kennyrose/article/de ...

  8. 《编写可维护的JavaScript》——JavaScript编码规范(七)

    UI层的松耦合 在web开发中,用户界面(UI)是由三个彼此隔离又相互作用的层定义的. HTML用来定义页面的数据和语义. CSS用来给页面添加样式,创建视觉特征. JavaScript用来给页面添加 ...

  9. 【转】解决Delphi WebBrowser 无法调用当前浏览器的版本

    procedure TregedtIE.FormCreate(Sender: TObject);   begin     WriteAppNameToReg;     WebBrowser1.Navi ...

  10. Java 动态生成复杂 Word

    Java 动态生成复杂 Word 阅读目录 1. 制作 Word 模版,将你需要动态生成的字段用${}替换.2. 将 Word文档保存为 xml .3. 引入项目. 项目中需要用 java 程序生成d ...