Javascript中创建对象的几种方式

Unidbg逆向阿里系App签名:从环境补全到算法还原实战 在移动安全与协议分析领域,理解应用层签名机制是核心挑战之一。签名算法作为保障通信安全与身份验证的关键技术,其原理通常涉及哈希、加密及密钥协商等基础密码学概念。在Android平台,核心签名逻辑常被加固并隐藏于Native层SO库中,以对抗动态调试与静态分析,这为安全研究和协议兼容带来了技术障碍。Unidbg作为一种基于模拟执行的逆向工程工具,通过模拟ARM指令集和系统调用,允许研究者在脱离真机环境的情况下,可控地执行和调试SO文件,为解决此类问题提供了创新思路。其技术价值在于实现了对加固代码的确定性分析与算 阅读详情

最近看网上各种文章 , 头异常的大 , 于是整理了一下

1. 工厂模式

单纯地创建对象, 使用Object构造函数, 或者字面量表示都 ok, 但是, 会产生大量重复代码, 每次都要写new Object()等等,
工厂模式可以解决这个问题

	function createPerson(name, job){
		// 创建一个Object
		var o = new Object()
		o.name = name
		o.job = job
		// 口吐芬芳
		o.sayFword= function(){
			alert('Funny')
		}
		return o
	}
	// 创建实例
	var person1 = createPerson('Tony Stark', 'Iron Man')
	var person2 = createPerson('进喜 王', '铁人')

工厂模式解决了创建多个相似对象的问题, 但是没有解决对象识别问题, 所有实例类型均为 object.
为了解决这个问题, 群众想出了构造函数模式

2. 构造函数模式
	function Person(name, job){
		this.name = name
		this.job = job
		// 口吐芬芳
		this.sayFword= function(){
			alert('Funny')
		}
	}
	// 创建实例
	var person1 = new Person('Tony Stark', 'Iron Man')
	var person2 = new Person('王进喜', '铁人')

这里, Person 取代了 createPerson函数, 而且, 有几个不同:

  • 没有显式创建对象
  • 直接将属性, 方法赋给了this
  • 没有显式return
  • 函数名以大写字母开头

这个时候, 就可以识别对象类型了

	person1.constructor === Person //true
	person2.constructor === Person //true

	person1 instanceof Person //true
	person2 instanceof Person //true

如果不用 new 会有什么后果 ?
后果是, this指向全局对象, 浏览器中, 传入的属性和方法都挂到window对象了

	var person3 = Person('王进喜', '铁人')
	window.name //'王进喜'
	window.job //'铁人'

我们可以用call或apply, 将this指向实例, 但这样标识不了类型, 构造函数模式便失去了意义

	var person4 = new Object()
	Person.call(person4, '王进喜', '铁人')
	person4.name //'王进喜'
	person4 instanceof Person //false

当然, 除非手动将__proto__指向Person.prototype, 这是后话

person4.__proto__ = Person.prototype
person4 instanceof Person // true

构造函数模式有一个问题 —— 每个方法都要在每个实例上创建一遍, 也就是说, 不同函数的同名方法实际上是不相等的

	// person1下的sayFword 和 person2下的sayFword 是两个不同的方法
	person1.sayFword === person2.sayFword //false

而我们想要让某一些方法成为该类型的所有实例共用的, 而不是每创建一个实例就去创建一个同样的方法/属性
于是, 群众又想出了下一个模式, 原型模式

3. 原型模式

原型模式的思想是, 给构造函数 (实际上只要是函数) 赋予一个prototype属性 , 这个属性的值是一个指针, 指向一个对象, 而这个对象包含其所有实例共享的属性和方法

	function Person(){
	}
	Person.prototype.name = 'Tony Stark'
	Person.prototype.job = 'Iron Man'
	// 口吐芬芳
	Person.prototype.sayFword= function(){
		alert('Funny')
	}
	// 创建实例
	var person1 = new Person()
	var person2 = new Person()
	person1.sayName === person2.sayName // true

默认情况下 prototype 会自动获得 constructor 属性, 该属性指向构造函数本身

	Person.prototype.constructor === Person  // true

如果实例中定义了跟prototype重名的属性, 会怎么样呢

	var person3 = new Person()
	person3.name = '灭霸'
	console.log(person3.name) //'灭霸'
	console.log(Person.prototype.name) // 'Tony Stark'

很明显, 原型上的同名属性并不会受到影响
我们可以用delete操作符删除对实例的属性, 从而重新访问原型中的属性

	delete person3.name
	console.log(person3.name) // 'Tony Stark'

需要注意的是, 使用 in 操作符, 即使属性是在原型上, 也会返回 true (for in 亦是如此)

	"job" in person3  //true

单纯的原型模式, 也是有缺点的, 例如

	function Person(){
	}
	Person.prototype = {
		friends: [1,2]
	}
	// 创建实例
	var person1 = new Person()
	var person2 = new Person()
	person1.friends.push(3)
	console.log(person2.friends)  // 1,2,3

如果共享的属性为引用类型, 修改实例该属性时, 会影响到原型上的该属性, 从而影响到其他实例
这个问题可以用 组合构造函数和原型模式 来解决

4. 组合构造函数和原型模式

构造函数模式用于定义实例的属性, 而原型模式用于定义方法和共享属性 , 集两家之所长

	function Person(name, job, friends){
		this.name = name
		this.job = job
		this.friends = friends
	}
	// 口吐芬芳
	Person.prototype.sayFword = function(){
		alert('Funny')
	}
	// 创建实例
	var person1 = new Person('Tony Stark', 'Iron Man', [1, 2])
	var person2 = new Person('王进喜', '铁人', [3, 4])
	person1.sayFword === person2.sayFword // true
	person1.friends.push(3)
	console.log(person2.friends)  // 3, 4
5. 动态原型模式

这种模式多了一层判断

	function Person(name, age) {
	    this.name = name;
	    this.age = age;
	    if (typeof this.sayFword != "function") {
	        Person.prototype.sayFword = function() {
	            alert(this.name);
	        };
	    }
	}

那么, 这样做的优点在哪呢 ?

想想看, 如果没有 if 的话,每 new 一次,都会重新定义一个新的函数,然后挂到Person.prototype.sayFword 属性上, 这就造成没必要的时间和空间浪费 。加上 if 后,只在new第一个实例时才会定义sayFword 方法,之后就不会了 。
并且 ————
if语句检查的可以是初始化之后应该存在的任何属性或方法 —— 不必用一大堆if语句检查每个属性和每个方法,只要检查其中一个即可。
———— 什么意思呢 ?
是这样的:假设除了sayFword 方法外,还定义了其他方法,比如sayHi、sayBye等等。此时只需要把它们都放到对sayFword 判断的if块里面就可以了

	if (typeof this.sayFword != "function") {
	    Person.prototype.sayFword = function() {...};
	    Person.prototype.sayHi = function() {...};
	    Person.prototype.sayBye = function() {...};
	    ...
	}

这样一来,要么它们全都还没有定义(new第一个实例时),要么已经全都定义了(new其他实例后),即它们的存在性是一致的,用同一个判断就可以了,而不需要分别对它们进行判断。

6. 寄生构造函数模式
	function SpecialArray() {
	    var values = new Array();
	    // 结构 arguments 拼接数组 ,在es6中不用这样写, 直接 value.push(...arguments)
	    values.push.apply(values, arguments);
	    // 此方法 将数组用|分隔拼接成字符串返回
	    values.toPipedString = function() {
	        return this.join('|');
	    };
	    return values;
	}

虽然它写的和工厂模式一样,但是创建时用了new,因此使得实现的过程不一样(但是实现过程不重要)
作用嘛, 比如创建具有额外方法的已有类型(如数组,Date类型等,但是又想不污染原有的类型 ;
例如上面如果直接在Array中定义新的方法,会污染其它的数组对象, 于是创建了一个 SpecialArray 类型, 它包含了Array 的所有方法, 又有自己的方法 toPipedString ;

7. 稳妥构造函数模式

稳妥对象指没有公共属性,而且其他方法也不引用this的对象。稳妥对象最适合在一些安全的环境中(这些环境中会禁止使用this和new),或者防止数据被其他应用程序改动时使用 .

	function Persion(name, age, job) {
	  // 创建要返回的对象
	  var o = new Object();
	  // 添加方法
	  o.sayName = function() {
	    alert(name);
	  }
	  return o;
	}
	var p1 = Persion('bill', 23, 'FE');
	p1.sayName() // bill;

除了了调用sayName()外,没有别的方式可以访问其他数据成员。

Stable-Baselines3性能优化:多环境训练对比指南(DummyVecEnv vs SubprocVecEnv) 本文深入对比了Stable-Baselines3中DummyVecEnv与SubprocVecEnv两种向量化环境的性能差异与应用场景。DummyVecEnv适用于轻量级、步进快的环境,调试友好且开销低;而SubprocVecEnv则通过真正的多进程并行,能显著加速计算密集型环境的训练。文章通过基准测试与决策树,指导开发者根据环境计算成本、CPU核心数等关键因素做出最优选择,以实现训练效率最大化。 阅读详情

相关推荐

红帽RHCE考试下午-RHCE (RH294)任务概览[2021最新版]

RH294任务概览 考试时间4个小时,6台虚拟机,15道题 原来通过脚本或者集群做的题现在都需要使用playbook实现 考试时大概有6台虚拟服务器,都已经做好了互相的免密 做题在ansible控制节点workstation做,但是需要去其他虚拟服务器进行验证 考试时需要将6台虚拟服务器在考试环境全部开启,物理机界面点击左侧按钮启动 考试时Ansible所有playbook都放在普通用户目录中且都以普通用户执行 注意:考试时一定注意要求将playbook放在哪个用户的家目录中,就需要用指定的户登录做题!

SunMy的博客 5619

js创建对象的三种方法

在 JavaScript 中,现阶段我们可以采用三种方式创建对象(object):

qq_73599840的博客 2502

ESP32系列之LVGL(三):Gui-Guider的使用

Gui-Guider的使用

m0_55986987的博客 2万+

javascript 创建对象的三种方法

2.使用关键字来创建对象——new Object()3.使用构造函数去创建对象。

a18173352623的博客 947

BGE-Reranker-v2-M3介绍

重排序模型介绍

吉米_王 5892

FPGA设计中的扇出约束实战:从XDC到代码优化的全流程解析

本文全面解析FPGA设计中扇出约束的重要性与应用,详细介绍了从XDC约束文件设置到HDL代码优化的全流程实战技巧。通过MAX_FANOUT约束控制信号负载,结合寄存器复制和物理优化策略,有效解决高扇出导致的时序违例和布线拥塞问题,提升设计性能和可靠性。

nept的博客 797

Javascript创建对象的4种方法

JavaScript里的对象是什么? JavaScript是一种基于对象的脚本语言。它不仅可以创建对象,也可以使用现有的对象。 那关于对象的创建有哪些方法呢? 第一种、直接创建法。 创建格式为:var 变量名={key1:value1,key2:value2…..} Value:可以是数据,也可以是方法。 例如:创建一个学生对象,包含:name,age。 Var Student={ name:“王一”, age:18,...

wo_2123311的博客 4653

解决gradle下载慢的问题

allprojects块的repositories用于多项目构建,为所有项目提供共同所需依赖包。而子项目可以配置自己的repositories以获取自己独需的依赖包。buildScript块的repositories主要是为了Gradle脚本自身的执行,获取脚本依赖插件。根级别的repositories主要是为了当前项目提供所需依赖包。慢的问题在于下载时链接的是官网,而官网下载速度太慢;1、解决gradle不同版本下载慢的问题。但是这个镜像站的版本不全,低版本可以用;有公司做的国内镜像站;

weixin_42551921的博客 2054

几种在JavaScript中创建对象的方式!

几种在JavaScript中创建对象的方式!

商务合作欢迎私信我 7743

SAP PI 系统复制,不只是把数据库拷过去,而是一次集成拓扑的重新落位

文章摘要:SAP PI/PO系统刷新生产数据到测试环境时,标准系统复制无法自动处理集成中枢特有的环境绑定问题。系统复制后,PI仍保留生产环境的连接配置,可能导致测试系统向生产环境发送消息。SAP提供的CTC模板可自动化部分后续配置,但无法替代人工对接口风险的全面评估。关键在于系统复制前绘制接口风险地图,复制后进行分层次验证:禁用生产连接、重定向测试接口、复核安全配置,并通过代表性链路测试确保系统行为符合预期。这需要结合SAP标准流程与业务语义判断,形成完整的治理闭环。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 84

西南科技大学模拟电子技术实验七(集成运算放大器的非线性应用)预习报告

将电位器Rp调至中心位置,用双综示波器观察并绘制方波U0的波形,测量其幅值和频率;将电位器RP调至中心位置,用示波器观察并绘制锯齿波U0的波形,记录;示波器基线调零,Ui输入1000HZ、幅值为2V的正弦信号,观察并记录Ui与U0波形,读出图中波形跳变时的Ui临界值;用万用表电位器RP调至预测结果位置,用示波器观察并描绘三角波输出U0及方波输出uo’,测其幅值、频率及Rp值,记录之。示波器基线调零,U输入1000HZ、幅值为2V的正弦信号,观察UI与U0波形。理论算法公式:当Ui

Welcome To My6n Blog 3937

js中创建对象的5种方法

与object构造函数模式类似,通过自定义一个构造函数,再进行new操作创建对象需要创建多个类型确定的对象。每个对象都有相同的数据,浪费内存。

jiangjunyuan168的博客 1万+

【HFSS】仿真目录

Author: JiJi\textrm{Author: JiJi}Author: JiJi Created Time: 2026.04.27\textrm{Created Time: 2026.04.27}Created Time: 2026.04.27 Modified Time: 2026.04.27\textrm{Modified Time: 2026.04.27}Modified Time: 2026.04.27如果大家觉得有用,就点个赞吧,在阅读过程中存在任何困惑,可在下方评论区留言~

u011699626的博客 310

js创建对象的几种方式

js常用的几种创建对象的方式有: {} new Object() 使用字面量 工厂模式 构造函数模式(constructor) 原型模式(prototype) 构造函数+原型模式 还有一些不常用的方式,如动态原型,寄生构造函数,稳妥构造函数。 一、通过{}创建对象 demo1: 01.newObj-1.html <script> 'use strict'; //使用strict模式 /** 使用{}创建对象,等同于 new Object();

qq_41648408的博客 6226

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【js面试题】不会还有人不知道JavaScript 创建对象的几种方式?

JavaScript 提供了多种创建对象的方式,每种方式都有其独特的用途和特点。字面量方式简单直接,适用于创建简单的临时对象;构造函数方式便于创建多个相同类型的对象,但可能存在内存浪费问题;原型模式能够让对象实例共享方法,节省内存;Object.create() 方法可精确控制对象的原型;ES6 类则提供了更清晰的语法结构,适合大型项目开发。在实际编程中,我们需要根据具体的需求和场景选择合适的创建对象方式。例如,对于小型的、临时性的对象,字面量方式可能就足够了;

weixin_52814911的博客 1119

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

JavaScript 创建对象的几种方式

JavaScript 创建对象的几种方式

qq_45716607的博客 73

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

JavaScript创建对象的几种方式

一、Object()创建对象、用字面量的方式创建对象 1.Object()创建对象 new Object()就是利用JavaScript提供的构造函数实例化了一个对象 var person = new Object(); //为这个实例化的对象添加属性 person.name = "zhangsan"; person.age =21; person.gender = 'male'; person.sayName = function(){ console.log(this.name) }

qq_51781439的博客 1334

js创建对象几种方式

1.通过字面量方式创建 方法:将成员信息写到{}中,并且赋值给一个变量。此时的这个变量就是一个对象 例如:var person={ name:'jack', sex:'girl', job:function(){} }  person.job(); 2.通过构造函数创建 方法:var person=new 函数名(); 通过该方法创建对象时,会自动执行该构造函数 例如: f

on the road的博客 5239

javascript中创建对象的几种方式

前言:         随着web 2.0 的兴起(最具代表性的是Ajax技术了),javascript不再是程序员眼中的“玩具语言”。 编程在不断的简化,可是“用户体验、性能、兼容性、可扩展......”要求却在不断提高,随之涌现出Prototype、jQuery、ExtJs、Dojo等优秀的框架(类库),大大简化了web开发。       越来越多的人开始深入研究和使用javascript,当

丁码农 2万+

JavaScript中创建对象的几种方式

字面量 / Object构造函数 这种方式相信大家都会,其实它们原理都是一样的,都是JS内置的对象Object,但是它们都是暴露在外面,代码冗余度高,也不清晰,而且无法复用,所以就有了之后的工厂模式。 工厂模式 工厂模式其实是设计模式中的一种,可以“批量生产”对象,我们先看看是怎么创建对象的: function createObject(name, age) { const obj = new ...

老曹的博客 917

20190709_JavaScript创建对象的几种方式

JavaScript创建对象的几种方式 JavaScript的ES6版本之前的语法中没有class关键字用于创建一个类并通过该类实例化一个对象 ES6版本之前会采用几种方法创建一个对象的类 1. 工厂模式 2. 构造函数模式 3. 改进构造函数模式 4. 原型模式 5. 动态原型模式 6. 寄生构造模式 7. 稳妥构造模式 工厂模式 设计模式中的工厂模式 抽象封装了生成对象的整个过程在工厂中...

weixin_43658383的博客 200

JavaScript - js进阶 -创建对象的几种方式 - 工厂模式

创建对象的几种方式 字面量 简单粗暴 不适合创建多个同样类型的对象的场景 const obj ={ name:"悟空",height:100,age:5000}; 工厂函数 容易理解 失去血缘关系,无法简单分辨对象的特征 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-

Henry_ID的博客 352
上一篇: vue生命周期整理
下一篇: 对CommonJS,AMD,CMD规范以及script标签异步加载的理解
飞驰的地铁
博客等级 码龄11年 13粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值