prototype演变
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演变的更多相关文章
- [原创]Javascript模拟“类”的综合实现方式以及部分细节【截至ES6】
[原创]Javascript模拟“类”的综合实现方式以及部分细节[截至ES6] 前言 最近几个旧项目里使用的图片编辑插件出现Bug, 经Review 后确定需要在其内外均做些改动,但是头疼的发现部 ...
- 闲聊——浅谈前端js模块化演变
function时代 前端这几年发展太快了,我学习的速度都跟不上演变的速度了(门派太多了,后台都是大牛公司支撑类似于facebook的react.google的angular,angular的1.0还 ...
- JavaScript中产生标识符方式的演变
本文记录下JS中产生标示符方式的演变,从ES5到ES6,ES5及其之前是一种方式,只包含两种声明(var/function),ES6则增加了一些产生标识符的关键字,如 let.const.class. ...
- 深入理解JavaScript中创建对象模式的演变(原型)
深入理解JavaScript中创建对象模式的演变(原型) 创建对象的模式多种多样,但是各种模式又有怎样的利弊呢?有没有一种最为完美的模式呢?下面我将就以下几个方面来分析创建对象的几种模式: Objec ...
- Java之美[从菜鸟到高手演变]之设计模式
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- 2.6 《硬啃设计模式》第8章 复制不是很难 - 原型模式(Prototype Pattern)
案例: 某即时战略游戏,你训练出来各种很强的战士. 为了增加游戏的可玩性,增加了一种复制魔法.实施该魔法,可以复制任意的战士. 你会怎样考虑这个设计? 在继续阅读之前,请先认真思考并写出你的设计,这样 ...
- JavaScript的__proto__、prototype和继承
JavaScript也是可以“继承”的! 各位看官或是好奇,或是一知半解.什么是prototype,__proto__,constructor.哪种继承方式好.今天就在这交流交流. 什么是protot ...
- .Net 大型分布式基础服务架构横向演变概述
一. 业务背景 构建具备高可用,高扩展性,高性能,能承载高并发,大流量的分布式电子商务平台,支持用户,订单,采购,物流,配送,财务等多个项目的协作,便于后续运营报表,分析,便于运维及监控. 二. 基础 ...
- js闭包 和 prototype
function test(){ var p=200; function q(){ return p++; } return q; } var s = test(); alert(s()); aler ...
随机推荐
- Keli Linux与网络安全(1)——在VMWare中安装Keli系统
Kali Linux是基于Debian的Linux发行版, 设计用于数字取证和渗透测试.由OffensiveSecurity Ltd维护和资助.最先由Offensive Security的Mati A ...
- poj2136
Vertical Histogram Time Limit ...
- linux dd实现磁盘完整全盘镜像备份backup,恢复recover(restore)
1,dd操作就是简单的按字节复制,什么分区表啊,MBR(master boot record)啊统统照搬; 1. 磁盘克隆 也就是把整个硬盘复制一份.当然你首先需要在计算机上在接上一块新硬盘,并让系统 ...
- Linux内核中常见内存分配函数(一)
linux内核中采 用了一种同时适用于32位和64位系统的内存分页模型,对于32位系统来说,两级页表足够用了,而在x86_64系 统中,用到了四级页表. * 页全局目录(Page Global Dir ...
- 【邻接表字符串Hash】【HDU1800】Flying to the Mars
题意: 给你N个数字,带前导0,问出现最多的数字个数 思路: 读入,清楚前导0,Hash. 用邻接表字符串Hash有一下几点注意 string,不要memset,否则地址也没了,涉及到stl的东西,少 ...
- Fix The thread xxx has exited with code 259 (0×103)
When run the test case in VS2013, you may encounter below problem After test case end, it will show ...
- MySQL常用指令
1.win下启动MySQL 命令行下输入: mysql –h localhost –u root -p / mysql -uroot -p 2.MySql下建表 输入命令 show database ...
- iOS 网络请求——post请求
-(void)postRequest{ NSString *urlString = [NSString stringWithFormat:@"http://f1.netgears.cn:80 ...
- 内存管理之三——Cocos2d-x学习历程(七)
1.容器---2.0版本 Cocos2d-x引擎为我们提供了CCArray.CCDictionary等Objective-C风格的容器.使用Cocos2d-x容器的一个重要原因在于Cocos2d-x的 ...
- nginx的配置说明
#定义Nginx运行的用户和用户组user www www; #nginx进程数,建议设置为等于CPU总核心数.worker_processes 8; #全局错误日志定义类型,[ debug | in ...