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[] ...
随机推荐
- statu 设置
DATA: itab TYPE TABLE OF sy-ucomm. APPEND 'DELE' TO itab. APPEND 'PICK' TO itab. SET PF-STATUS 'STA3 ...
- Java内部类(转发:)
内部类是指在一个外部类的内部再定义一个类.类名不需要和文件夹相同. 内部类分为: 成员内部类.局部内部类.静态嵌套类.匿名内部类 . 1.成员内部类 成员内部类是最普通的内部类,它的定义为位于另一个类 ...
- LeetCode:区域和检索【303】
LeetCode:区域和检索[303] 题目描述 给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点. 示例: 给定 nums = [ ...
- Java进阶学习:JSON解析利器JackSon
Java:JSON解析利器JackSon JackSon基础 1.Maven项目引入 <!-- https://mvnrepository.com/artifact/org.codehaus.j ...
- HDU - 3081 Marriage Match II 【二分匹配】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=3081 题意 有n对男女 女生去选男朋友 如果女生从来没和那个男生吵架 那么那个男生就可以当她男朋友 女 ...
- STM32F4XX高效驱动篇1-UART
之前一直在做驱动方面的整理工作,对驱动的高效性有一些自己的理解这里和大家分享一下.并奉驱动程序,本程序覆盖uart1-8. 串口驱动,这是在每个单片机中可以说是必备接口.可以说大部分产品中都会使用,更 ...
- 剑指offer之 数值的整数次方
问题描述:实现函数double power(double base,int exponent),求base的exponent次方.不能使用库函数,同时不需要考虑大数问题. package Proble ...
- Entity Framework 学习笔记(二)之数据模型 Model 使用过程
Entity Framework 数据模型 Model 创建的使用: 开发环境:VS2012 数据库:SQL Server 2008 Entity Framework 版本:6.12 下面是新建的 ...
- Spark- 常见问题
记录spark使用中常见问题 SparkSQL 日期解析时用到SimpleDateFormat, SimpleDateFormat是线程不安全的.可以使用 FastDateFormat 如: impo ...
- Sqoop- sqoop将mysql数据表导入到hive报错
sqoop将mysql数据表导入到hive报错 [root@ip---- lib]# sqoop import --connect jdbc:mysql://54.223.175.12:3308/gx ...