setp1


var Person = function () {}; //构造器
var p = new Person();

setp1 演变:

     var Person = function () {};
var p = new Person();
/*
==> p.__proto__ = Person.prototype ==> Person.call(p);
*/

setp1 演变证明

    var Person = function () {};
var p = new Person();
alert(p.__proto__=== Person.prototype) //true
  • __proto__是内部原型,prototype是构造器原型(构造器其实就是函数)
  • 所有构造器/函数的__proto__都指向Function.prototype,它是一个空函数(Empty function)
  • Function.prototype.__proto__ === Object.prototype 与此同时 Object.prototype.__proto__ === null

setp2

     var Person = function () {};  //构造器
Person.prototype.Say = function () { //原型方法
alert("Person say")
}
var p = new Person();
p.Say();

setp2 演变:

      var Person = function () {};  //构造器
Person.prototype.Say = function () { //原型方法
alert("Person say")
}
var p = new Person();
/*
==> p.__proto__ = Person.prototype ==> Person.call(p);
*/
p.Say();
/*
==> p.Say() (找不到!) ==> p.__proto__.Say() (找到了)
*/

setp2 演变证明:


var Person = function () {};
var p = new Person();
alert(p.Say=== Person.prototype.Say) //true

step3


var Person = function () {}; //构造器
Person.prototype.Say = function () { //原型方法
alert("Person say");
}
Person.prototype.Salary = 50000; //原型属性 var Programmer = function () { }; //构造器
Programmer.prototype = new Person();
Programmer.prototype.WriteCode = function () { //原型方法
alert("programmer writes code");
};
Programmer.prototype.Salary = 500; //原型属性 var p = new Programmer();
p.Say();
p.WriteCode();
alert(p.Salary);

step3演变:


var Person = function () {}; //构造器
Person.prototype.Say = function () { //原型方法
alert("Person say");
}
Person.prototype.Salary = 50000; //原型属性 var Programmer = function () { }; //构造器
Programmer.prototype = new Person();
/*
==》 Programmer.prototype = p1 ( var p1 = new Person() )
//这里 : p1.__proto__ == Person.prototype
==> Programmer.prototype.__proto__ == p1.__proto__ == Person.prototype
==》 Programmer.prototype.__proto__ = Person.prototype;
*/
Programmer.prototype.WriteCode = function () { //原型方法
alert("programmer writes code");
};
Programmer.prototype.Salary = 500; //原型属性 var p = new Programmer();
/*
==》p.__proto__ = Programmer.prototype ;
==》 p.__proto__.__proto__ = Person.prototype
*/
p.Say();
/*
==> p.Say() (没有这个Say)
==> p.__proto__.Say()(没有这个Say)
// p.__proto__ == Programmer.prototype (没有这个Say)
==> p.__proto__.__proto__.Say() (找到了!)
// p.__proto__.__proto__ = Person.prototype(这里有Say)
*/
p.WriteCode();
/*
==> p.WriteCode() (没有这个WriteCode)
==> p.__proto__.WriteCode (找到了!) // p.__proto__ == Programmer.prototype(这里有WriteCode)
*/

prototype演变的更多相关文章

  1. [原创]Javascript模拟“类”的综合实现方式以及部分细节【截至ES6】

    [原创]Javascript模拟“类”的综合实现方式以及部分细节[截至ES6] 前言   最近几个旧项目里使用的图片编辑插件出现Bug, 经Review 后确定需要在其内外均做些改动,但是头疼的发现部 ...

  2. 闲聊——浅谈前端js模块化演变

    function时代 前端这几年发展太快了,我学习的速度都跟不上演变的速度了(门派太多了,后台都是大牛公司支撑类似于facebook的react.google的angular,angular的1.0还 ...

  3. JavaScript中产生标识符方式的演变

    本文记录下JS中产生标示符方式的演变,从ES5到ES6,ES5及其之前是一种方式,只包含两种声明(var/function),ES6则增加了一些产生标识符的关键字,如 let.const.class. ...

  4. 深入理解JavaScript中创建对象模式的演变(原型)

    深入理解JavaScript中创建对象模式的演变(原型) 创建对象的模式多种多样,但是各种模式又有怎样的利弊呢?有没有一种最为完美的模式呢?下面我将就以下几个方面来分析创建对象的几种模式: Objec ...

  5. Java之美[从菜鸟到高手演变]之设计模式

    设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  6. 2.6 《硬啃设计模式》第8章 复制不是很难 - 原型模式(Prototype Pattern)

    案例: 某即时战略游戏,你训练出来各种很强的战士. 为了增加游戏的可玩性,增加了一种复制魔法.实施该魔法,可以复制任意的战士. 你会怎样考虑这个设计? 在继续阅读之前,请先认真思考并写出你的设计,这样 ...

  7. JavaScript的__proto__、prototype和继承

    JavaScript也是可以“继承”的! 各位看官或是好奇,或是一知半解.什么是prototype,__proto__,constructor.哪种继承方式好.今天就在这交流交流. 什么是protot ...

  8. .Net 大型分布式基础服务架构横向演变概述

    一. 业务背景 构建具备高可用,高扩展性,高性能,能承载高并发,大流量的分布式电子商务平台,支持用户,订单,采购,物流,配送,财务等多个项目的协作,便于后续运营报表,分析,便于运维及监控. 二. 基础 ...

  9. js闭包 和 prototype

    function test(){ var p=200; function q(){ return p++; } return q; } var s = test(); alert(s()); aler ...

随机推荐

  1. C语言的本质(8)——副作用与顺序点

    C 语言中,术语副作用是指对数据对象或者文件的修改.例如以下语句 var = 99; 的副作用是把 var 的值修改成 99.对表达式求值也可能产生副作用,例如: se = 100 对这个表达式求值所 ...

  2. nexus 7 2013 驱动安装及root

    驱动安装 Nexus 7 2013连接上电脑后,设备管理器显示新设备 nexus 7 待安装驱动(其实是MTP设备待安装驱动).去谷歌网站下载最新的USB驱动,version 8.0 的.与以前的版本 ...

  3. NPOI操作EXCEL--设置密码及设置只读

    有时,我们可能需要某些单元格只读,如在做模板时,模板中的数据是不能随意让别人改的.在Excel中,可以通过“审阅->保护工作表”来完成,如下图:      那么,在NPOI中有没有办法通过编码的 ...

  4. c++犯过的严重错误

    1.if(num == 0)写成了if(num = 0)导致软件运行一直崩溃且找不到原因,浪费了很大的代价,以后我写这种语法的时候一直写if(0 == num) 2.if (sting.find(&q ...

  5. JSF简单介绍

    JSF简单介绍 一. 什么是 JSF: JavaServer Faces (JSF) 是一种用于构建 Web 应用程序的新标准 Java 框架.它提供了一种以组件为中心来开发 Java Web 用户界 ...

  6. 四、cocos2dx动画Animation介绍

    qinning199原创,欢迎转载,转载请注明:http://www.cocos2dx.net/?p=22 一.帧动画 你可以通过一系列图片文件,像如下这样,创建一个动画: CCAnimation * ...

  7. 利用协议代理实现导航控制器UINavigationController视图之间的正向传值和反向传值

    实验说明 (1)正向传值:比如A类里地值要传给B类用,就是我们先在A类中声明一个B类对象(当然B类头文件要import过来),然后把A类中得某个 值传递给B类中得某个值(所以需要在B类中先准备一个变量 ...

  8. java设计模式之——代理模式

    1,什么是代理模式? 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问. 2,策略模式有什么好处? 在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象 ...

  9. 用iframe框架,登录过期后登录框在框架里加载的问题

    就是登录界面出现在iframe的框架里,而不是整个页面都跳转,找到了一个JS的解决方法,只要把下面的代码放在登录界面的<head></head>里就行了. <script ...

  10. 一个很好的用C#导出数据到Excel模板的方法

    /// <summary> /// 导数据到Excel模板 /// </summary> /// <param name="tab">要输出内容 ...