原型模式&原型继承

UART中断接收的实战陷阱:HAL库常见误区与性能调优指南 本文深入解析STM32 HAL库UART中断接收机制,揭示常见实战陷阱如数据溢出、中断优先级配置不当等,并提供性能调优方案。重点介绍如何使用空闲中断处理不定长数据、DMA与中断混合模式优化,以及工业级错误恢复与流量控制策略,帮助开发者构建稳定可靠的串口通信系统。 阅读详情

使用克隆的原型模式

从设计模式角度讲,原型模式是用于创建对象的一种模式,如果我们要创建一个对象,一种方法是先指定它的类型,然后通过类来创建这个对象。原型模式选择了另外一种方式,不用关心对象的具体类型,而是通过克隆来创建一个一模一样的对象。

原型模式的实现关键,是语言本身是否提供了clone方法。ECMAScript5提供了Object.create方法,可以用来克隆对象。

var Plane = function(){
	this.blood = 100;
	this.attackLevel = 1;
	this.defenseLevel = 1;
}
var plane = new Plane();
plane.blood = 500;
plane.attackLevel = 10;
plane.defenseLevel = 7;
var clonePlane = Object.create(plane);
console.log(clonePlane); //输出:Object{blood: 500, attackLevel: 10, defenseLevel: 7}

//在不支持Object.create 方法的浏览器中,则可以使用以下代码:
Object.create = Object.create || function(obj) {
	var F = function(){};
	F.prototype = obj;
	return new F();
}

JavaScript中的原型继承

1、所有的对象都是从Object.prototype对象克隆而来。

var obj1 = new Object();
var obj2 = {};
Object.getPrototypeOf(obj1) === Object.prototype;// true
Object.getPrototypeOf(obj2) === Object.prototype;// true

2、要得到一个对象,不是通过实例化类,而是找到一个对象作为原型并克隆它。

在JavaScript里,我们不需要关心克隆的细节,由内部引擎负责实现。我们显示地调用var obj1 = new Object()或者var obj2 = {}。此时引擎内部会从Object.prototype上面克隆一个对象出来,我们最终得到的就是这个对象。

使用new操作符从构造器中得到一个对象

function Person(name){
	this.name = name;
};
Person.prototype.getName = function(){
	return this.name;
};
var a = new Person('zee');
console.log(a.name);//zee
console.log(a.getName());//zee
console.log(Object.getProttotypeOf(a) === Person.prototype);//true

用new运算符来创建对象的过程,实际上也只是先克隆Object.prototype对象。

new运算的过程:

function Person(name){
	this.name = name;
};
Person.prototype.getName = function(){
	return this.name;
};
var objectFactory = function(){
	var obj = new Object(), // 从Object.protoype上克隆一个空的对象
		Constructor = [].shift.call(arguments);//取得外部传入的构造器,此例是Person
		obj.__proto__ = Constructor.prototype; // 指向正确的原型
		var ret = Constructor.apply(obj, arguments); // 借用外部传入的构造器obj设置属性
		return typeof ret === 'object' ? ret : obj; // 确保构造器总是会返回一个对象
};
var a = objectFactory(Person, 'zee');
console.log(a.name);//zee
console.log(a.getName());//zee
console.log(Object.getProttotypeOf(a) === Person.prototype);//true
------------------------------------------------------------------
var a = objectFactory(A, 'zee');
var a = new A('zee');

3、对象会记住他的原型

var a = new Object();
console.log(a.__proto__ === Object.prototype);

实际上__proto__就是对象跟“对象构造器的原型”联系起来的纽带。正因为对象要通过__proto__属性来记住它的构造器的原型。

4、如果对象无法响应某个请求,它会把这个请求委托给它的构造器的原型

var obj = {name:'zee'};
var A = function(){};
A.prototype = obj;
var a = new A();
console.log(a.name);// zee

(1)首先,尝试遍历对象a中的所有属性,但没有找到name这个属性。
(2)查找name属性的这个请求被委托给对象a的构造器的原型,它被a.__proto__记录着并且指向A.prototype,而A.prototype被设置为对象obj。
(3)在对象obj中找到了name属性,并返回它的值。

ES6原型继承

class Animal {
	constructor(name){
		this.name = name;
	}
	getName(){
		return this.name;
	}
}
class Dog extends Animal {
	constructor(name){
		super(name);
	}
	speak(){
		return 'woof';
	}
}
var dog = new Dog('Scamp');
console.log(dog.getName() + 'says' + dog.speak());
从FER2013到AffectNet:表情识别数据集十年演进史与你的项目选型攻略 本文回顾了从FER2013到AffectNet等主流人脸表情识别数据集的十年演进历程,详细分析了各数据集的特点、适用场景及技术突破。针对不同项目需求,提供了从移动端应用到高精度研究的选型策略,特别强调AffectNet在现代FER项目中的核心价值,并给出混合数据集构建的实战方案。 阅读详情

相关推荐

【Qt笔记】1.VSCode搭建Qt运行环境

Qt6之后已经抛弃qmake,使用cmake。cmake相对qmake来说只有优点没有缺点。使用VSCode搭建完Qt的运行环境就能开开心心debug了.vscode需要使用的插件:2.Qt tools3.CMakec++插件可以不关注,缺啥都会提醒你.正常安装即可。

没有手牌的博客 2万+

js原型继承

这是一道非常经典的前端面试题,尤其是对于初中级前端来说,基本上是必考题。

qq_38217940的博客 4567

基于STM32F407ZGT6与INMP441的I2S音频采集系统:从配置到实时波形显示

本文详细介绍了基于STM32F407ZGT6与INMP441麦克风模块的I2S音频采集系统设计与实现。从硬件选型、CubeMX配置到音频数据处理和上位机波形显示,全面解析了系统架构、DMA传输优化及常见问题解决方案,帮助开发者快速构建高精度音频采集系统。

weixin_33743661的博客 403

原型和继承

对象 也叫实例。具有属性(特征)和方法(行为)。 类 基于一个类(相当于模板)可以创建多个对象(实体)。 js没有类,基于对象(构造函数和原型对象)扩展新的对象。 封装 阐述对象中的内容,隐藏信息(方法和属性的可见性)。封装包括封装数据和实现。 js无public/private等关键字限定 方法和属性的可见性,只能通过变量的作用域(函数)来实现。对象和对象之间通过暴露的API通信。 聚合 多个对象合并。 继承 类与类之间,代码重用。 多态 不同对象通...

weixin_43594183的博客 832

Cisco Packet Tracer 7.3免登录技巧:3种方法快速跳过注册界面(附详细截图)

本文针对Cisco Packet Tracer 7.3启动时遇到的登录界面问题,提供了三种合法高效的解决方案。详细介绍了如何利用官方访客模式快速启动、注册思科账号实现一劳永逸登录,以及通过调整本地安装配置优化启动流程,帮助网络学习者与备考者绕过繁琐步骤,快速进入实验环境。

weixin_29305337的博客 739

AI 时代嵌入式工程师的能力模型与学习路线:全系列收官

AI 时代嵌入式工程师的能力模型与学习路线:全系列收官

weixin_42162924的博客 34

原型的继承,几种常用的继承方法

原型的继承 原型的继承方式有很多多种,今天主要说四种常用的方法 一 子类原型继承父类的实例(原型链继承)

qq_44771388的博客 3472

【制作100个unity游戏之22】3DRPG游戏开发07——其他详细的设计

我们会有有很多单例,如果每个单例都去写会很麻烦,所以我们定义泛型单例模式 Singleton,我们将所有的单例都继承这个泛型单例,就省略很多重复的工作定义一个GameManager类,继承Singleton,控制整个游戏的进度,比如如果主角死了,广播,游戏结束调用。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2577

【JavaScript】原型继承详解

在面向对象编程中,继承是一个对象可以从另一个对象获得属性和方法的机制。JavaScript 使用原型继承而非类继承,每个对象都有一个隐式关联的原型对象(通过__proto__引用),并且可以访问该原型对象的属性和方法。构造函数是 JavaScript 中用于创建对象的函数。通过使用new关键字,可以调用构造函数并创建新的对象实例。每个构造函数都会自动拥有一个prototype属性,指向一个包含所有实例共享属性和方法的对象。// 输出:Dog在这个例子中,Animal是一个构造函数,dog是。

lph159的博客 2049

华为OD新系统机试真题 - 配置操作失败数量统计

华为OD机试新系统 4月8号【配置操作失败数量统计】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【配置操作失败数量统计】。

qq_45776114的博客 1159

cesium 深度图(获取区域最高最低点位)

文章摘要: Cesium深度图技术可用于获取区域地形高程数据,核心实现步骤包括:1)通过离屏相机构建独立渲染环境,使用正交投影确保采样精度;2)采用离屏渲染技术获取均匀分布的地形点数据。关键技术点包含多边形外包矩形计算、后台相机配置(5km高度正交投影)、1024×1024像素离屏视图设置,以及深度数据解析(RGBA格式转换和三维坐标还原)。该方法避免了主视图干扰,可精准获取区域内地形高程信息,为填挖方分析等应用提供基础数据支持。

God's asylum的博客 283

原型继承

在编程中,我们经常会想获取并扩展一些东西。 例如,我们有一个user对象及其属性和方法,并希望将admin和guest作为基于user稍加修改的变体。我们想重用user中的内容,而不是复制/重新实现它的方法,而只是在其至上构建一个新的对象。 原型继承(Prototypal inheritance)这个语言特性能够帮助我们实现这一需求。 [[Prototype]] 在 ...

guiguiann789的博客 519

【007】C++编程必知:原码、补码、反码的全面解读

计算机存储的是数据的补码。原码:计算机中对数字的二进制定点表示方法。比如123的原码是0111 1011。无符号数:原码=反码=补码。有符号数:要分正数和负数,正数的最高位为0,负数的最高位为1。其中,正数的原码、反码、补码都是相同的;负数的反码等于原码的符号数(最高位)不变,其他位取反;补码等于反码+1。比如:-123的原码是1111 1011,反码为1000 0100,补码为1000 0101。原码、补码和反码都是用于计算机表示有符号整数的方法。

Lion_Long的博客 2920

js创建对象的构造函数模式+原型模式和组合继承\Hybrid Pattern & combination inheritance

HybridPatternExample function Person(name, age, job) { this.name = name; this.age = age; this.job = job; this.friends = ['A', 'B']; } Person.prototype = {

梦骑士的博客 427

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

设计模式(7)[JS版]-JavaScript设计模式之原型模式如何实现???

目录 1.什么是原型模式 2 参与者 3实例讲解 4使用 Object.create实现原型模式 4.1Object.create()的用法 4.2 用Object.create实现继承 4.2.1 单继承 4.2.2 多继承 4.3 propertyObject参数 4.4 Polyfill 4.5改写原型模式实现 5 总结 1.什么是原型模式 原型模式(prototype)是指用原型实例指向创建对象的种类,并且通过拷贝这些原型创建新的对象。 原型模式不单是一种设...

AlbertYang的博客 7383

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

设计模式创建者模式 之原型模式&构建者模式

以上就是原型模式和构建者模式 至此 创建者模式完结之前更新过的:设计模式 创建者模式之 单例模式-优快云博客​​​​​​设计模式 创建者模式之 工厂模式-优快云博客。

weixin_72655813的博客 1719

js原型、原型对象、原型链、原型模式

原型模式是用于创建对象的一种模式,找到一个对象,然后通过克隆来创建一个一模一样的对象。那么, 如果需要一个对象跟某个对象一模一样的对象,就可以使用原型模式来创建对象。 那怎么理解原型呢?通俗的说:如果对象A是对象B克隆而来的,那么B对象就是A对象的原型。如何通过原型模式来创建对象的函数呢?代码如下: function inherit(obj){ if(obj === null) throw Ty...

Miss_hhl的博客 499

js原型模式

语言之魂——原型模式 原型模式(Prototype):用原型实例指向创建对象的类,是用于创建新的对象的类共享源性对象的属性与方法。 //图片轮播 var LoopImages = function( imgArr, container ){ this.imgArr = imgArr; //轮播图片的数组 this.cont

Hi_xiexialing的博客 656

【设计模式】原型模式:用“克隆”术让对象创建更灵活

本文讲解了C++中的原型模式,一种通过“克隆”已有对象创建新实例的设计模式。文章从核心概念入手,剖析其“复制即创建”的优势,并通过详细的代码示例展示如何实现简易原型及深拷贝,解决浅拷贝隐患。结合图形编辑、游戏开发等应用场景,阐明其在复杂对象创建中的价值。文中还对比了原型模式与工厂模式的区别,总结其优缺点,帮助读者全面掌握这一模式。无论是初学者还是进阶开发者,都能从中轻松理解原型模式的原理与实践应用。

一名热爱编程的程序员 2224

【C++】原型模式

原型模式(Prototype Pattern)是一种【创建型】设计模式,它允许通过复制现有对象(原型)来创建新对象,而无需依赖显式的类实例化过程。这种模式特别适用于创建成本较高或实例化过程复杂的对象,通过克隆现有对象可以显著提高性能。

AAADiao的博客 1012

实战设计模式之原型模式

与工厂方法模式、抽象工厂模式一样,原型模式也是一种对象创建型模式。它提供了一种创建对象的新方式:通过复制一个已有实例,来创建新的实例。这种方式避免了构造函数的局限性,特别是当对象的创建成本很高或初始化过程比较复杂时。在某些情况下,克隆现有对象可能比直接实例化新对象更高效。复印机是现实生活中运用原型模式的一个典型例子:当我们有一份纸质文档,并希望快速获得多份副本时,可以使用复印机来复制原始文档。这种方式比重新打印每一份文档要快得多,也更加方便。

hope_wisdom的技术博客 1504

【Java设计模式】原型模式

文章目录概述适用场景优点缺点演示 概述 定义:指原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 特点:不需要知道任何创建的细节,不调用构造函数 类型:创建型 适用场景 类初始化消耗较多资源 new产生的一个对象需要非常繁琐的过程(数据准备、访问权 限等) 构造函数比较复杂 循环体中生产大量对象时 优点 原型模式性能比直接new一个对象性能高 简化创建过程 缺点 必须配备克隆方法(cl...

明月沉江春雾晓 1786

c++ 设计模式之原型模式

按照设计模式书上的介绍: 意图:        用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 适用性:         当一个系统应该独立于他的产品创建、构成和表示时,需要使用原型模式         当要实例化的类是在运行时刻指定时,如通过动态装载         为了避免创建一个与产品类层次平行的工厂类层次时         当一个类的实例只能有几个不同状态组

lbqBraveheart的专栏 7777

设计模式回顾——原型模式(C++)

原型模式(Prototype Pattern),是一种创建型设计模式,指的是以原型实例指定待创建对象的种类,并通过拷贝(克隆)原型对象来创建新的对象。

只要思想不滑坡,想法总比问题多。 1206

设计模式11-原型模式

通过对象创建模式绕开动态内存分配来避免创建过程中所导致的耦合过紧的问题。从而支持对象创建的稳定,它是接口抽象之后的第一步工作。原型模式同样用于隔离类对象的使用者和具体类型之间的耦合关系,同样要求这些异变类拥有稳定的接口。原型模式对于如何创建异变类的实体对象,采用原型克隆的方法来做。它使得我们可以非常灵活的动态创建。拥有某些稳定接口的新对象。所需工作仅仅是注册一个新类的对象即原型,然后在任何需要的地方克隆。原型模式中的克隆方法可以利用某些框架中的序列化,来实现深拷贝。

qq_41810539的博客 1543

前端开发设计模式——原型模式

可以定义一个构造函数,并在构造函数的原型上添加属性和方法,然后通过new关键字创建对象,这些对象将继承构造函数原型上的属性和方法。这里通过自定义构造函数创建了对象,同样实现了原型模式的功能。

jxnd123456的博客 2694

010-原型模式

原型模式摘要 原型模式是一种通过复制现有对象来创建新对象的设计模式,适用于创建成本高的对象场景。核心特征包括对象复制、避免重复初始化、运行时确定类型和减少子类数量。模式包含三个角色:原型接口(定义复制方法)、具体原型(实现复制)和客户端(调用复制)。实现时需注意浅拷贝(仅复制引用)和深拷贝(复制引用的对象)的区别。Java中可通过Cloneable接口实现,Python/JavaScript利用语言特性实现更简单。典型应用场景包括避免重复初始化、动态配置对象和保存对象状态等。

wyl703的博客 1050
上一篇: 封装
下一篇: this、call和apply
DoubleSRZee
博客等级 码龄10年 7粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值