JavaScript原型模式(prototype)
1.原型是一个对象,其他对象可以通过它实现属性的继承
所有对象在默认的情况下都有一个原型,因为原型的本身也是对象,
所以一个类的真正原型是被类的内部[prototype]属性所指出。
每个函数都有一个属性叫做prototype,这个prototype的属性值是一个对象(属性的集合),默认的只有一个叫做constructor的属性,指向这个函数本身。
如上图,SuperType是是一个函数,右侧的方框就是它的原型。
注:上图来自 http://www.cnblogs.com/wangfupeng1988/p/3978131.html
2.什么可以称之为对象?
在JavaScript中一个对象:就是任何的无序的键值对的集合function var a={}
如果他不是一个主数据类型(undefined null boolean number string)其他的通通叫做对象。
JavaScript中的原型(prototype)是和函数(function紧密相连的)
var o={} 他不是有用function他有原型吗? 答:必须的
每一个通过new操作符生成出来的对象都持有一个属性__proto__,这个属性保存了创建他的构造函数的prototype的原型的引用。
类的扩展方式有两类共三种:
说明一下,是在原型链上层扩展出来的。
两类:分为是否是function定义的类分为两种。
由function定义的只有一种,不是有function定义的有两种。
(1)由function定义的类
function person() {}//定义一个空对象
    person.prototype.name="我是一个在原型链上层扩展出来的";//属性扩展
    person.prototype.showName=function () {
        alert(this.name);//this表示调用本函数的一个具体实例化的类
    }
    new person().showName();//调用方式
(2)不是由function定义的类,有隐示扩展和显示扩展。
(2.1)第一种扩展方式,显示扩展,通过Object
Object.getPrototypeOf(cat).name="猫咪";//通过object获取原型链
(2.2)第二种扩展方式,隐示扩展,通过__proto__属性。
cat.__proto__.age=;//我在上层《==》 cat.age=10;
(3)调用
cat.name+cat.age //猫咪 10
画图理解为:

梳理一下,类扩展方法
function  person() {
    this.getName=function (str) {
        alert(str);
    }
}
person.prototype.getAge=function (age) {
    alert(age);
}
1,实现一个空类继承function定义的类的属性.
方法为,让空类的对象所持有的原型的索引(__proto__)变成function类所持有的原型的索引(prototype)。
var b={};//空类
b.__proto__=per.prototype;//让空类 的对象所持有的原型的索引(__proto__)变成function类所持有的原型的索引(prototype)  原型链   上级对等  【此时为类的索引】
    b.getAge();
2,简单方式实现继承
var b={};//空类
b.__proto__=new per();//指向per的per
b.__proto__.constructor=b;//继承后构造函数发生了改变,改变构造函数指向b本身的构造函数
使用图梳理一下原理:
索引的变化:
(1)

(2)如果per是空对象的话,类b就完全变成类per.
(3)当per不为空时,实质为,b.__proto__=new per();b类只接在per类后面。
此时b的构造函数是per的构造函数(b继承per而来的)
但是,我们需要的时b类自身的构造函数,可以使用以下方法实现继承后构造函数的改变。
b.__proto__.constructor=b;//只是改变构造函数
说明一下,此时为类b除去构造函数外继承与类per。

JavaScript原型模式(prototype)的更多相关文章
- Javascript原型模式总结梳理
		
在大多数面向对象语言中,对象总是由类中实例化而来,类和对象的关系就像模具跟模件一样.Javascript中没有类的概念,就算ES6中引入的class也不过是一种语法糖,本质上还是利用原型实现.在原型编 ...
 - 面向对象的JavaScript --- 原型模式和基于原型继承的JavaScript对象系统
		
面向对象的JavaScript --- 原型模式和基于原型继承的JavaScript对象系统 原型模式和基于原型继承的JavaScript对象系统 在 Brendan Eich 为 JavaScrip ...
 - Net设计模式实例之原型模式( Prototype Pattern)
		
一.原型模式简介(Brief Introduction) 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. Specify the kin ...
 - 二十四种设计模式:原型模式(Prototype Pattern)
		
原型模式(Prototype Pattern) 介绍用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象.示例有一个Message实体类,现在要克隆它. MessageModel usin ...
 - 设计模式(四)原型模式Prototype(创建型)
		
设计模式(四)原型模式Prototype(创建型) 1. 概述 我们都知道,创建型模式一般是用来创建一个新的对象,然后我们使用这个对象完成一些对象的操作,我们通过原型模式可以快速的创建一个对象 ...
 - 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)
		
原文:乐在其中设计模式(C#) - 原型模式(Prototype Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:weba ...
 - 原型模式-Prototype(Java实现)
		
原型模式-Prototype 通过复制(克隆.拷贝)一个指定类型的对象来创建更多同类型的对象. 就像去蛋糕店买蛋糕一样. 柜台里的蛋糕都是非卖品. 只是为顾客提供一种参照. 当顾客看上某一个样式的蛋糕 ...
 - 原型模式 prototype 创建型 设计模式(七)
		
原型模式 prototype 意图 用原型实例指定需要创建的对象的类型,然后使用复制这个原型对象的方法创建出更多同类型的对象 显然,原型模式就是给出一个对象,然后克隆一个或者更多个对象 小时候看 ...
 - JavaScript -- 原型:prototype的使用
		
JavaScript -- 原型:prototype的使用 在 JavaScript 中,prototype 是函数的一个属性,同时也是由构造函数创建的对象的一个属性. 函数的原型为对象. 它主要在函 ...
 - C# -- 等待异步操作执行完成的方式  C# -- 使用委托 delegate 执行异步操作  JavaScript -- 原型:prototype的使用  DBHelper类连接数据库  MVC View中获取action、controller、area名称、参数
		
C# -- 等待异步操作执行完成的方式 C# -- 等待异步操作执行完成的方式 1. 等待异步操作的完成,代码实现: class Program { static void Main(string[] ...
 
随机推荐
- 阿里云centos7搭建php+nginx环境
			
阿里云Centos搭建lnmp(php7.1+nginx+mysql5.7) https://jingyan.baidu.com/article/215817f7a10bfb1eda14238b.ht ...
 - Oracle视图传递参数
			
在Oracle里,视图不像存储过程和函数一样,可以定义输入参数,但我们可以变个方式,使用程序包来实现. oracle package: oracle package是oracle包,是一组相关过程.函 ...
 - 排序算法-python版
			
总结了一下常见集中排序的算法 归并排序 归并排序也称合并排序,是分治法的典型应用.分治思想是将每个问题分解成个个小问题,将每个小问题解决,然后合并. 具体的归并排序就是,将一组无序数按n/2递归分解成 ...
 - 使VS自动生成代码注释
			
1.注释模板位置C:\Program Files\Microsoft Visual Studio 11.0\Common7\IDE\ItemTemplatesCache 里面有各种脚本的模板 2.找到 ...
 - 扩展 Yii2 自带的日志组件
			
<?php /** * author : forecho <caizhenghai@gmail.com> * createTime : 2015/12/22 18:13 * desc ...
 - STM32F4XX高效驱动篇1-UART
			
之前一直在做驱动方面的整理工作,对驱动的高效性有一些自己的理解这里和大家分享一下.并奉驱动程序,本程序覆盖uart1-8. 串口驱动,这是在每个单片机中可以说是必备接口.可以说大部分产品中都会使用,更 ...
 - java入门了解11
			
1.码表 (一)码表种类 ASCII:美国标准信息交换码,用一个字节的7位可以表示 ISO8859-1:拉丁码表.欧洲码表,用一个字节的8位表示,对ASCII没用到空间补充了自己特有的 GB2312: ...
 - thinkphp3.2新部署是错
			
下载好thinkphp3.2,使用M或者D方法是,报FILE: tp\ThinkPHP\Library\Think\Db.class.php LINE: 42 可能的错误是,配置文件中没有配置数据库连 ...
 - Java 学习摘要
			
//导入 import java.util.Date; import java.text.DateFormat; import java.text.SimpleDateFormat; Date dt= ...
 - 分享知识-快乐自己:MyBtis内置缓存机制
			
在实际的项目开发中,通常对数据库的查询性能要求很高,而mybatis提供了查询缓存来缓存数据,从而达到提高查询性能的要求. mybatis的查询缓存分为一级缓存和二级缓存,一级缓存是SqlSessio ...
 
			
		

