创建对象的几种模式

【水文】calico-node 启动失败 Init:CrashLoopBackOff Defaulted container "calico-node" out of: calico-node, upgrade-ipam (init), install-cni (init), mount-bpffs (init) Error from server (BadRequest): container "calico-node" in pod "calico-node-4j7td" is waiting to start: PodInitializing 阅读详情

对象字面量的方式不能量产“同类”对象。

1. 工厂模式

function createPerson(name, age, job) {
  var o = new Object()
  o.name = name
  o.age = age
  o.job = job
  o.printName = function() {
    console.log(this.name);
  }
  return o
}

var person1 = createPerson('Richard', 21, 'Engineer');
var person2 = createPerson('Gary', 19, 'Fool');

评价:解决了创建相似对象的问题,但无法识别对象的类型。

2. 构造函数模式

function Person(name, age, job) {
  this.name = name
  this.age = age
  this.job = job
  this.printName = function() {
    console.log(this.name)
  }
}

var person1 = new Person('Terry', 21, 'Software Engineer')
var person2 = new Person('Jerry', 12, 'Doctor')

特点:

  • 没有显示创建对象,直接将属性和方法赋值给了this对象;没有return语句
  • 自定义的构造函数实例化后的实例属于该特定类型(即instanceof值为该构造函数)

使用new调用构造函数时发生的事儿:

  1. 创建一个新的对象
  2. 将构造函数的作用域赋给上述新对象,即this指向该新对象
  3. 执行构造函数中的代码(为新对象添加属性和方法)
  4. 返回新对象

缺点:如上示例中,person1与person2的printName属性并非同一个,即使功能相同,即不能共享函数或属性。

3. 原型模式

每个函数都有一个prototype属性,该属性是一个指向原型对象的指针。

而这个“原型对象”的用途就是用来共享属性和方法的。

function Person() {
}

Person.prototype.name = 'Zed'
Person.prototype.age = 21
Person.prototype.job = 'driver'
Person.prototype.printName = function() {
  console.log(this.name)
}

var person1 = new Person()
var person2 = new Person()
person1.printName()

如上所示:name, age, job, printName是所有Person实例所共享的

4. 组合使用构造函数模式与原型模式

构造函数用于定义实例属性,原型模式用于定义共享方法与共享属性。

function Person(name, age, job) {
  this.name = name
  this.age = age
  this.job = job
  this.friends = ['sheldon', 'penny']
}

Person.prototype = {
  constructor: Person,
  printName: function() {
    console.log(this.name)
  }
}

const Rajesh = new Person('Rajesh', '35', 'Astronomer')
const Howard = new Person('Howard', '36', 'Applied Physicist')

这种构建模式是目前使用最广泛、认同度最高的创建自定义类型的方法。可以说是定义引用类型的一种默认模式了。

5. 动态原型模式

该模式避免了 构造函数与原型的分离,将原型的定义封装在了构造函数中

function Person(name, age, job) {
  this.name = name
  this.age = age
  this.job = job
  if (typeof this.printName !== 'function') {
    Person.prototype.printName = function() {
      console.log(this.name)
    }
  }
}

6. 寄生构造函数模式

function Person(name, age, job) {
  var o = new Object()
  o.name = name
  o.age = age
  o.job = job
  o.printName = function() {
    console.log(this.name)
  }
  return o
}

const friend = new Person('Nite', 22, 'Noidea')

注意:寄生函数构造模式返回的对象与构造函数或者构造函数的原型属性间没有任何联系。也就是说,该模式返回的对象与在构造函数外创建的对象没什么不同,不指定对象类型。
使用场景:在不行改变Array数组原型的情况下添加额外方法,可用此模式。

7. 稳妥构造函数模式

Douglas Crockford发明了稳妥对象 (durable objects)

所谓稳妥对象,指的是没有公共属性,而且其方法不能引用this对象。适合在安全环境中使用。

与寄生构造函数模式的不同点:

  • 新创建对象的实例方法不引用this
  • 不适用new操作符调用构造函数
function Person(name, age, job) {
  var o = new Object()
  o.name = name
  o.age = age
  o.job = job
  o.printName = function() {
    console.log(name)
  }
  return o
}

不太明白啥意思 暂时也用不到吧,就这样吧!

基于STM32的室内环境监测系统设计与实现 摘要 本文设计了一种基于STM32的室内环境监测系统,通过传感器实时采集温湿度、空气质量、烟雾浓度等数据,并利用Wi-Fi模块上传至云服务器。系统采用STM32F103C8T6作为主控芯片,结合DHT11、MQ系列传感器及BMP280气压传感器实现数据采集,通过ESP8266模块实现远程数据传输。用户可通过手机APP实时查看环境参数,并在数据超标时触发报警。实验表明,系统运行稳定,监测精度高,具有低成本、易扩展等特点,为改善室内环境质量提供了有效解决方案。 关键词:STM32;室内环境监测;传感器;Wi-F 阅读详情

相关推荐

从NHANES到发表:如何用survey包完成符合CDC要求的统计分析(含完整R代码)

本文详细介绍了如何利用R语言的survey包,对美国国家健康与营养调查数据进行符合CDC要求的统计分析。文章重点解析了NHANES数据的复杂抽样设计、权重变量的正确选择与调整,并提供了从数据获取、清洗、构建调查设计对象到执行加权回归及生成发表级表格的完整R代码实战指南,帮助研究者避免常见错误,确保分析结果的准确性与可发表性。

weixin_29054245的博客 521

我所知道的创建对象的4种模式

今天是2022年4月10号,昨天蓝桥杯刚结束,虽然是第一次参加这种比赛,而且还是线下的,但是对我来说真的很有趣,虽然题不会写,但是还是体验了一番参加比赛的快感,现在天气开始变的很热了,我们也开始有了第一个项目,让写某小说官网,也是第一次团队合作,希望能多学到东西。话不多说,进入正题 1,Object构造函数模式 适用于起始时不确定对象数据 问题:语法多 var p = new Object() p.name = "cbo"; p.age = 18; p.setName = function

weixin_63699342的博客 287

squirrel校园二手交易平台

squirrel校园二手交易平台 (适合寻找SSM项目练手的你。) 项目起源:   期末的课程设计,三人一组,我和两个舍友,一时起兴,决定做一个校园二手交易平台,一开始兴致与激情满满,可是后期时间上的冲突,让我们三个人对于这个项目有点累。   这个项目刚定题两天,BezosLee由于通过了360的网上在线笔试,收到了360公司的免费培训邀请,要去北京的360总部进行培训一周,值得庆...

K.SHI的博客 5万+

23种设计模式分类

软件设计模式使人们可以更加简单方便复用成功的设计和体系结构,它通常包含以下几个基本要素:模式名称、别名、动机、问题、解决方案、效果、模式角色、合作关系、实现方法、实用性、已知应用、例程、模式扩展和相关模式等。

zxn2010的专栏 1298

set_data_check专题[使用,report_timing,setup/hold检查]

set_data_check用于约束『数据-对-数据』的『建立保持』时间检查,通常被称为非时序约束 ( non-sequential constraints ), 理论上set_data_check 可以设在任意的两个data pin 上,其中一个pin 称为 constrained pin 类似于寄存器的data pin, 另一个pin 称为related pin 类似于寄存器的clock pin.

cy413026的博客 1万+

四大厂商网络设备巡检命令实战指南:华为、华三、锐捷、思科

本文详细介绍了华为、华三、锐捷、思科四大厂商网络设备的巡检命令实战指南,涵盖硬件状态、软件运行和网络功能等核心维度。通过具体命令示例和实用技巧,帮助网络工程师高效完成设备巡检,预防潜在故障,确保网络稳定运行。

weixin_29235923的博客 390

Java中创建对象的5种不同方法

http://toutiao.com/a6308956688981328129/?tt_from=mobile_qq&utm_campaign=client_share&app=news_article&utm_source=mobile_qq&iid=4892135741&utm_medium=toutiao_ios

u013322876的博客 276

详解AUTOSAR:DaVinci Configurator导入ARXML配置(拓展篇—2)

DaVinci Configurator导入ARXML配置。

不脱发的程序猿 3325

旅游网项目案例以及源码

旅游网案例 技术选型 Web层 Servlet:前端控制器 html:视图 Filter:过滤器 BeanUtils:数据封装 Jackson:json序列化工具 Service层 Javamail:java发送邮件工具 Redis:nosql内存数据库 Jedis:java的redis客户端 Dao层 Mysql:数据库 Druid:数据库连接池 JdbcTemplate:jdbc的工具 创建数据库 创建数据库 create database travel; 使用数据库 use travel

kiligzzz的博客 1799

节省人力成本40%!仓储物流AI机器人调度系统实战案例(含路径规划算法与系统架构图)

首先,我们需要定义一个Node类self.x = x # 节点x坐标self.y = y # 节点y坐标self.g = g # 从起点到当前节点的实际成本(g值)self.h = h # 从当前节点到终点的启发式成本(h值)self.f = g + h # 总成本(f值)self.parent = None # 父节点(用于回溯路径)self.task_id = task_id # 任务IDself.priority = priority # 任务优先级(1=最高,5=最低)

小程序开发 948

[Dify实战] 招聘筛简历机器人:自动筛选、排序、生成面试要点-带绑定资源

摘要:本文介绍了如何利用Dify优化简历筛选流程,解决人工筛选耗时、标准不统一等问题。通过结构化输出"评分+亮点+风险+面试关注点",将主观判断转化为规则化流程。关键步骤包括:设计标准化Prompt、配置权重排序策略、确保公平合规性、与ATS系统对接,以及持续优化评估指标。该方法能显著提升筛选效率(缩短招聘周期)、增强一致性(避免主观偏差),并为面试官提供结构化参考信息,最终实现更高效精准的人才筛选。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 581

Python-Django毕业设计自助旅游平台(程序+Lw)

在旅游景点管理页面,管理员可以查看景点名称、地区、封面、景点星级、景点地址、营业时间、负责人、联系电话等信息,可根据需要进行详情、修改、删除等操作,如下图。在旅游线路管理页面,管理员可以查看线路名称、景点名称、出行方式、图片、起点、途经路段、终点等信息,可根据需要进行详情、修改、删除等操作,如下图。或者 Mac OS;

Python计算机毕设程序源码_ 173

PDN分析实战:电源完整性设计与Altium PDN Analyzer全流程指南

电源完整性(PI)是嵌入式硬件系统稳定运行的基础能力,其核心在于控制电流密度与电压降两大物理量。基于欧姆定律与热-电耦合原理,PDN分析将抽象的电源噪声问题转化为可量化、可定位的几何与电气参数优化过程。该技术显著提升系统抗干扰能力、降低复位与ADC漂移等隐性故障率,并直接支撑EMC合规性设计。典型应用场景包括电机驱动板、Wi-Fi模块、STM32/ESP32等资源受限型MCU供电网络验证。本文以Altium Designer为工具平台,结合IPC-2152标准与真实工程案例,详解从功率预算、模型构建到瓶颈定

weixin_28949937的博客 228

javaScript创建对象的几种模式

javaScript创建对象的几种模式

qq_26391203的博客 899

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

JavaScript 中创建对象的几种模式

JavaScript 中创建对象的几种模式 虽然Object构造函数或对象字面量都可以用来创建单个对象,但这种方式有个明显的缺点:使用同一个借口创建很多对象,会产生大量重复的代码。为解决这个问题,人们开始使用工厂模式的一个变体。 工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程。考虑到ESMAScript中无法创建类,开发人员就发明了一种函数,用函数封...

Miever的博客 249

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

js创建对象的几种模式

js创建对象的几种模式工厂模式构造函数模式原型函数模式组合模式动态原型模式寄生构造函数模式稳妥构造函数 工厂模式 原理: 在一个函数内部完成创建对象添加属性和方法。 缺陷: 无法识别对象的类型。 占内存,没有提取公共方法。 实例: function createPerson(name, age, job){ var o = new Object(); o.name = nam...

clh918的博客 253

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

JavaScript中创建对象的几种模式

代码如下: 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>创建对象的模式</title> 6 <meta name="viewpo...

demonHunter1234的博客 236

JS中创建对象的几种设计模式

工厂模式 定义:工厂模式非常直观,将创建对象的过程抽象为一个函数,用函数封装以特定接口创建对象的细节。通俗地讲,工厂模式就是将创建对象的语句放在一个函数里,通过传入参数来创建特定对象,最后返回创建的对象。 缺陷:工厂模式虽然可以创建多个相似的对象,但却不能解决对象标识的问题,即怎样知道一个对象的类型(如下,我只知道s1是Object-...

weixin_33872660的博客 105

javascript中创建对象的几种设计模式

亲爱的小伙伴,关于javascript中的对象创建,你知道多少种方式呢?下边就让我来分享一下关于javascript创建对象的几种模式吧。

LLL3189860667的博客 981

js中创建对象的几种模式

工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程(本书后面还将讨论其他设计模式及其在 Javascript t中的实现)考虑到在 ECMAScript中无法创建类,开发人员就发明了一种函数,用函数来封装以特定接口创建对象的细节,如下面的例子所示。 // 工厂模式 // 注意写法,此时还没有构造函数,函数名小写 function creatperson(name,age){ var o = new Object(); o.name = name;

qq_45371853的博客 178

JavaScript 创建对象的几种模式

在JavaScript中虽说可以用Object的构造函数或者字面量创建单个对象,但是用这些方式来创建多个对象时就有一个明显的缺点,产生了大量的重复代码。为解决这些问题,许多模式就应运而生。 1. 工厂模式 由于在ECMAScript中无法创建类,所以就发明了一种函数,用来封装以特定接口创建对象的细节。 但是以这种方式创建的对象没有解决对象识别问题,即怎样知道一个对象的类型。 funct...

weixin_30438813的博客 105

JavaScript创建对象的几种重要模式

一、工厂模式 1. 代码示例 function person(name, age) { var p = new object(); p.name = name; p.age = age; p.sayName = function() { console.log(this.name); }; return p; } var person1 = person...

aiguanyi0149的博客 124
上一篇: XSS跨站脚本攻击
下一篇: 理解原型对象
zyan_cn
博客等级 码龄9年 4粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值