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 ...
随机推荐
- getopt vs getopts
getopt示例 #!/bin/bash aflag=no args=`getopt a: $@` ]; then echo 'Usage: ...' exit fi set -- $args ] d ...
- Aix字符集
aix 安装中文字符集 1.看到系统安装过的字符集 locale -a 2.安装 smitty-->System Environments-->Manage Language Enviro ...
- 使用Transaction访问数据库(C#,TransactionScope,.NET 2.0)
针对SQL2005和.NET 2.0的事物机制有了新的突破传统数据库事物访问机制,代码如下: 或者这种,其实都差不多 ...
- ruby on rails出现的问题ActiveModel::ForbiddenAttributesError
首先分清楚我们在搞rails时.看资料和所使用的环境的版本号是否同样.看的资料是rails3.2,电脑配置的环境是4.0,就会出现这样的安全防范措施的问题. 这类问题大多出如今new或者create两 ...
- 配置启动挂载:fstab文件具体解释
fstab文件介绍 fstab文件包括了你的电脑上的存储设备及其文件系统的信息.它是决定一个硬盘(分区)被如何使用或者说整合到整个系统中的文件. 详细来说:用fstab能够自己主动挂载各种文件系统格式 ...
- HBASE学习笔记--shell
Hbase shell 启动 下载安装hbase client包,填写相关配置后进入,配置相关说明可以参见配置篇 指令:./bin/hbase shell 状态及配置信息查询 查询服务器状态 stat ...
- 使用optimizely做A/B测试
摘要: optimizaly是一个提供A/B测试服务的网站,可以可视化地在线编辑测试内容和目标,简单方便. 1. A/B测试简介 所谓 A/B 测试,简单来说,就是为同一个目标制定两个方案(比如两 ...
- ajax 实例
jsp页面代码: <script type="text/javascript"> var xmlHttp; function createXMLHttp(){ if(w ...
- c# 根据中文汉字获取到拼音
public static String ConvertToPinyin(String str) { if (String.IsNullOrEmpty(str)) return String.Empt ...
- 应用程序无法启动,因为应用程序的并行配置不正确,有关详细信息,请参阅应用程序事件日志,或使用命令行SxsTrace.exe工具
今天做项目,需要用C#引用C++的链接库文件,但是在调试的时候会报错这个错误. 运行SxsTrace.exe 以管理员用户登陆,启动cmd; 执行命令:SxsTrace Trace -logfile: ...