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 ...
随机推荐
- javascript小知识1 this的用法
函数的应用: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...
- SPFA,dijskra,prime,topu四种算法的模板
////#include<stdio.h> ////#include<string.h> ////#include<queue> ////#include<a ...
- C# 使用XmlDocument类对XML文档进行操作
原创地址:http://www.cnblogs.com/jfzhu/archive/2012/11/19/2778098.html 转载请注明出处 W3C制定了XML DOM标准.很多编程语言中多提供 ...
- memcached在注册表的位置
HKEY_LOCAL_MACHINE-System-ControlSet001-services-Memcached Server
- sql server存储过程分页
Create PROCEDURE [dbo].[Table_GetList] ) = '', -- 查询条件(注意: 不要加 WHERE) ) = '', -- 设置排序 , -- 页尺寸 , -- ...
- mac nodejs&npm 安装
https://www.baidu.com/link?url=Ekv7EzWuMOXjIqFL_ewddWzdahU7jMAsWY4gOGOjMtC&ie=UTF-8&wd=nodej ...
- js实现睡眠
//js暂停函数 function Pause(obj, iMinSecond) { if (window.eventList == null) window.eventList = new Arra ...
- 为什么getline()后要两次回车????(将输入的字符串按单词倒序输出)
#include<iostream>#include<string>#include<algorithm>using namespace std;int main( ...
- 指针直接赋值为整型AND利用宏定义求结构体成员偏移量
首先我们要更正一个很熟悉的概念,那就是指针不仅仅是“地址”,指针还有一个很重要的特性,那就是“类型”. 指针初始化时,“=”的右操作数; 除外,该语句表示指针为空): 所以 ; 这样的代码是不允许的. ...
- js返回值
看下js变量.作用域.内存文档. 1. <script type="text/javascript"> function c(){ return 23; } var a ...