JavaScript中创建对象的几种模式(原型)--源自技术

稳扎稳打JavaScript(三)——创建对象的几种方式 有了前面两篇文章的基础后,我们来谈一谈在JS中创建对象的几种方式。 建议大家先预习下先前的两篇博客: 稳扎稳打JavaScript(一)——作用域链 稳扎稳打JavaScript(二)——图解对象内存模型在JS中,创建对象的方式有很多,而且各有千秋,我们需要根据实际的业务需求选择不同的方式。1. 工厂模式这是创建对象最为简单的方式。1.1. 定义方式工厂模式的思想是:将对象构建的过程封装在一个 阅读详情

**JavaScript创建对象模式:

  • 对象字面量
  • 工厂模式
  • 构造函数模式
  • 原型模式
  • 结合构造函数和原型模式
  • 原型动态模式 
    ** 
    面向对象的语言大都有一个类的概念,通过类可以创建多个具有相同方法和属性的对象。虽然从技术上讲,javascript是一门面向对象的语言,但是javascript没有类的概念,一切都是对象。任意一个对象都是某种引用类型的实例,都是通过已有的引用类型创建;引用类型可以是原生的,也可以是自定义的。

1、对象字面量

<code class="hljs javascript has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">var</span> person = {
        name : <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'Nicholas'</span>;
        age : <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'22'</span>;
        job :<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"software Engineer"</span>
        sayName: <span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">function</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">()</span> {</span>
            alter(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">this</span>.name);
    }
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li></ul>
例子中创建一个名为person的对象,并为它添加了三个属性(name,age,job)和一个方法(sayName()),其中,sayName()方法用于显示this.name(被解析为person.name)的值。

对象字面量可以用来创建单个对象,但这个方法有个明显的缺点:使用同一个接口创建很多对象,会产生大量重复的代码。

2、工厂模式 
工厂模式是软件工程领域中一种广为人知的设计模式,工厂模式抽象了创建具体对象的过程,用函数来封装以特定的接口创建对象的细节。

function createPerson(name,age,job){
    var o = new object{};
    o.name=name;
    o.age=age;
    o.job=job;
    o.sayName=function(){
        alert(this.name);
    };
    return o;
}

var person1=creatPerson("Nicholas",22,"software Engineer");
var person2=creatPerson("Greg",24,"student");
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
函数creatPerson{}能够根据接受的参数构建一个包含所有必要信息的Person对象。可以无数次的调用这个函数,每次都会返回一个包含三个属性一个方法的对象。

工厂模型虽然解决了创建多个相似对象的问题,却没有解决对象识别的问题(即怎么知道一个对象的类型)。 
3、构造函数模式

function Person(name,age,job) {
    this.name = name;
    this.age = age;
    this.job = job;
    this.sayName = function() {
        alert(this.name);
    }
}
//通过new操作符创建Person的实例
var person1 = new Person("Nicholas",22,"software Engineer");
var person2 = new Person("Greg",24,"student");
person1.sayName(); //Nicholas
person2.sayName(); //Greg
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

与工厂模式不同的是

  • 没有显示的创建对象
  • 直接将属性和方法赋给了this对象
  • 没有return语句

创建Person的新实例,必须使用new操作符。调用构造函数的4个步骤:

  • 创建一个新对象
  • 将构造函数的作用域赋给新对象(this指向了这个新对象)
  • 执行构造函数中的代码
  • 返回新对象

这个例子中创建的所有对象既是Object的实例,也是Person实例。可以通过instanceof操作符验证。

alert(person1 instanceof Object);//true
alert(person1 instanceof Person);//true
 
  • 1
  • 2

构造函数模式也有自己的问题,实际上,sayName方法在每个实例上都会被重新创建一次,需要注意的是,通过实例化创建的方法并不相等,以下代码可以证明 
alert(person1.sayName == person2.sayName);//false 
可以将方法移到构造器的外部作为全局函数来解决这个问题。

function Person(name,age,job) {
    this.name = name;
    this.age = age;
    this.job = job;   
}
function sayName() {
        alert(this.name);
    }
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在全局下创建的全局函数实际上只能被经由Person创建的实例调用,这就有点名不副实了;如果对象需要定义很对方法,那么就要定义很多个全局函数,缺少封装性。 
4、原型模式 
JavaScript中创建的每个函数都有一个prototype(原型)属性,它是一个指针,指向一个对象,包含了可以由特定类型的所有实例共享的属性和方法(让所有的对象实例共享它的属性和方法)

function Person() {}
   Person.prototype.name ="Nicholas";
   Person.prototype.age = 22;
   Person.prototype.job = "software Engineer";   
   Person.prototype.sayName(){
       alert(this.name);
   };
 var person1 = new Person();
 person1.sayName(); //Nicholas
alert(person1.sayName == person2.sayName);//true
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

以上代码做了这几件事情:

  • 定义了一个构造函数Person,Person函数自动获得一个prototype属性,该属性默认只包含一个指向Person的constructor属性
  • 通过Person.prototype添加三个属性,和一个方法
  • 创建一个Person的实例,随后在实例上调用了sayName()方法 
    使用Person构造函数和Person.prototype创建实例的代码为例,展示个对象之间的关系 
    使用Person构造函数和Person.prototype创建实例的代码为例,展示个对象之间的关系 
    图中展示了Person构造函数、Person的原型属性以及Person的两个实例,之间的关系。Person.prototype指向了原型对象,Person.prototype.constructor有指回了Person。原型对象中除了包含constructor属性,还包含后来添加的其他属性和方法,Person的两个实例person1和person2都包含一个内部属性,该属性仅指向Person.prototype。 
    sayName()方法的调用过程:
  • 在person1实例上查找logName()方法,发现没有这个方法,于是追溯到person1的原型
  • 在person1的原型上查找sayame()方法,有这个方法,于是调用该方法

    基于这样一个查找过程,我们可以通过在实例上定义原型中的同名属性,来阻止该实例访问原型上的同名属性,需要注意的是,这样做并不会删除原型上的同名属性,仅仅是阻止实例访问。

function Person() {}
   Person.prototype.name ="Nicholas";
   Person.prototype.age = 22;
   Person.prototype.job = "software Engineer";   
   Person.prototype.sayName(){
       alert(this.name);
   };
 var person1 = new Person();
 var person2 = new Person();
 person1.name="Greg"
alert(person1.name) //Greg 来自实例
alert(person2.name) //Nicholas 来自原型
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

使用delete操作符可以完全删除实例属性

delete person1.name;
alert(person1.name) //Nicholas 来自原型
 
  • 1
  • 2

使用hasOwnProperty()方法可以检测一个属性是存在于实例还是原型中

function Person() {}
   Person.prototype.name ="Nicholas";
   Person.prototype.age = 22;
   Person.prototype.job = "software Engineer";   
   Person.prototype.sayName(){
       alert(this.name);
   };
 var person1 = new Person();
 var person2 = new Person();
 alert(person1,hasOwnProperty("name"));//false
 person1.name="Greg"
alert(person1.name) //Greg 来自实例
 alert(person1,hasOwnProperty("name"));//true
alert(person2.name) //Nicholas 来自原型
 alert(person2,hasOwnProperty("name"));//false
 delete person1.name;
alert(person1.name) //Nicholas 来自原型
 alert(person1,hasOwnProperty("name"));//false
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

下图展示了在不同情况下实例与原型之间的关系这里写图片描述

简单的原型语法

function Person() {}
 Person.prototype={
  name :"Nicholas",
  age : 22,
  job : "software Engineer",  
  sayName:function(){
       alert(this.name);
       }
   };
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在上面的代码中constructor属性不再指向Person了,通过constructor无法确定对象的类型了。可以像下面这样特意将他设置回适当的值

function Person() {}
 Person.prototype={
 constructor:Person,
  name :"Nicholas",
  age : 22,
  job : "software Engineer",   
  sayName:function(){
       alert(this.name);
       }
   };
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

重设constructor属性会导致它的[[Enumerable]]特性被设置为true,默认情况,原生的constructor属性是不可枚举的,可以使用Object.defineProperty()方法来改变

Object.defineProperty(Person.prototype,"constructor",{
    enumerable:false,
    value:Person
});
 
  • 1
  • 2
  • 3
  • 4

原型中查找值的过程是一次搜索,原型对象所做的任何修改都能从实例上立即反应出来

var friend=new Person();
Person.prototype.sayHi=function(){
    alert("hi);
}
friend,sayHi();//"hi"(没有问题)
 
  • 1
  • 2
  • 3
  • 4
  • 5

person实例是在添加新方法之前创建的,但仍可以访问新添加的方法,原因是实例与原型之间的松散连接关系 
重写原型对象后的情况

function Person() {}
var friend=new Person();
 Person.prototype={
  name :"Nicholas",
  age : 22,
  job : "software Engineer",  
  sayName:function(){
       alert(this.name);
       }
   };
   friend.sayName();//error
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

调用friend.sayName()时发生错误的原因是,friend指向的原型中不包含以该字段命名的属性,如下图。 
这里写图片描述 
原型对象的问题 
原型对象省略了为构造函数传递初始化参数这一环节,所有势力在默认情况下都取得相同的属性值。原型模型最大的问题是有其共享本性所导致的。当原型模型包含引用类型的属性来说,问题就比较严重了。来看下面的例子。

function Person() {}
 Person.prototype={
 constructor:Person,
  name :"Nicholas",
  age : 22,
  job : "software Engineer",   
  friends:["Shelby","Court"],
  sayName:function(){
       alert(this.name);
       }
   };
   var person1=new Person();
   var person2=new Person();
   person1.friend.push("Van");
   alert(person1.friends);//"Shelby,Court,Van"
   alert(person2.friends);//"Shelby,Court,Van"
 alert(person1.friends==person2.friends);//true
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

5、组合使用构造函数模式和原型模式 
组合使用构造函数模式和原型模式中,构造函数用于定义实例属性,原型模型用于定义方法和共享的属性。这样每个实例都会有自己的一份实例属性的副本,同时也可以共享对方法的引用,最大限度的节省了内存。

function Person(name,age,job) {
    this.name = name;
    this.age = age;
    this.job = job;   
    this.friends=["Shelby","Court"];
}
Person.prototype={
  constructor:Person,
  sayName:function(){
       alert(this.name);
       }
   }
var person1=new Person("Nicholas",22,"software Engineer");
var person2 = new Person("Greg",24,"student");
person1.friend.push("Van");
   alert(person1.friends);//"Shelby,Court,Van"
   alert(person2.friends);//"Shelby,Court"
 alert(person1.friends==person2.friends);//false
 alert(person1.sayName==person2.sayName);//true
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

6、动态原型模式 
原型动态模式将需要的所有信息都封装到构造函数中,通过if语句判断原型中的某个属性是否存在,若不存在(在第一次调用这个构造函数的时候),执行if语句内部的原型初始化代码。

function Person(name,age) {
    this.name = name;
    this.age = age;
    this.job =job;
//方法
    if(typeof this.sayName != 'function') {
    Person.prototype.sayName = function() {
           alert(this.name);
        };      
    }
}

var friend = new Person('Nicholas','22','Software Engineer');//初次调用构造函数,此时修改了原型
var person2 = new Person('amy','21');//此时sayName()方法已经存在,不会再修改原型
别再折腾环境了!Windows 11 + VSCode + CMake 3.31.4 + MinGW-w64 一键式配置指南(附常见报错解决) 本文提供Windows 11下VSCode、CMake 3.31.4和MinGW-w64的一键式配置指南,帮助开发者快速搭建高效C++开发环境。涵盖工具链选型、环境变量配置、项目初始化及常见报错解决方案,大幅提升开发效率。 阅读详情

相关推荐

手把手教你用Matlab实现Copula函数:从理论到代码的完整指南

本文提供了一份在MATLAB中实现Copula函数的完整实战指南。从理解Sklar定理和常见Copula家族(如高斯、t、Clayton)的核心概念出发,详细讲解了数据预处理、边缘分布拟合、概率积分变换等关键步骤。通过具体代码示例,手把手演示了Copula模型的拟合、评估、蒙特卡洛模拟,并进阶应用于金融风险度量(如VaR计算)和条件分布分析,帮助读者掌握这一强大的多变量依赖建模工具。

y9z0a1b的博客 953

js创建对象的几种方式

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

qq_41648408的博客 6226

PMF5.0计算

EPA PMF5.0 计算步骤

nuistsy的博客 4546

JavaScript 创建对象的几种方式

这里创建对象,主要介绍三种方式:工厂模式、构造函数模式、原型模式、组合使用构造函数模式和原型模式。1、工厂模式 工厂模式是用函数来封装创建对象的细节,在函数里面创建对象并返回对象。function createPerson(name,age,job){ var o = new Obkect(); o.name = name; o.age = age; o.job =...

Lea 5818

学习海康VisionMaster之BLOB分析

6):软阈值(相对):是一种动态阈值分割方法,其核心思想是 基于图像局部特性(如背景或参考区域)自适应调整阈值范围,适用于光照变化明显、背景灰度不均的场景。3:拖入位置修正功能:这个非常重要,模版匹配成功后会得到新的匹配坐标,那和创建模版时候的原点坐标会组合成一个坐标变换矩阵,通过这个矩阵,那后续的blob分析窗口则可以实现精确定位来查找目标对象。(2):设定参数:这里阈值方式是blob的核心算法,根据不同的应用场景来选择不同的阈值方式。8:高级参数:是设定blob区域的特征范围,用于筛选出来特定的区域。

yuhouxiyang的专栏 3621

如何安装最新版本的 SAP ABAP Development Tool ( ADT ) ,并且能够随时升级

下载链接:https://tools.hana.ondemand.com/#abap 首先安装 Eclipse IDE for Java Developers 找到适合自己操作系统的 Eclipse 安装包: 安装之后,打开Eclipse: Install -> New Softwares, 输入 url:https://tools.hana.ondemand.com/latest 全部安装: 安装完毕之后,新建一个 ABAP Project,本地 SAP GUI 里添加的系统,会自动带出来:

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

JavaScript 创建对象 (工厂模式、构造函数模式、原型模式、组合使用构造函数模式与原型模式)

JavaScript 创建对象工厂模式构造函数模式三级目录 总结JS创建对象的几个模式及各自优缺点 工厂模式 function createPerson(name,age,job){ var obj = new Object(); obj.name = name; obj.age = age; obj.job = job; obj.sayName = function(){ console.log(this.name); }; return obj; } var person1 = cre

Ahua_Core的博客 6054

【原理图PCB专题】Cadence 17.4版本原理图及PCB 模块复用

在我们设计复杂板卡的时候,往往会遇到一部分电路被反复使用的情况。Cadence允许设计者一开始就将复用模块设计好,以后只要直接调用复用模块就可以直接用以设计更复杂的电路板了。这对于大规模集成设计无疑是非常好的选择,它不仅让设计者不必花费时间在相同模块反复设计上,更有利于电路的模块化设计。

一点硬件 2017

JS中使用原型模式创建对象

JS中prototype,__proto__,constructor的关系,JS中使用原型模式创建对象。

Linda的前端开发路 3408

22、忆阻器、忆阻系统及其神经形态应用综述

本文综述了忆阻器与忆阻系统的理论基础及其在神经形态系统中的广泛应用。从忆阻器的基本定义出发,介绍了其在非线性电路、存储技术、通信和神经形态计算等领域的应用潜力。重点探讨了基于忆阻器的神经元模型(如Hodgkin-Huxley、FitzHugh-Nagumo和Hindmarsh-Rose模型)、突触实现方式及多种忆阻神经网络架构,包括细胞神经网络、脉冲神经网络和递归神经网络等。此外,深入分析了忆阻器在水库计算中的理论研究与硬件实现进展,展示了其在时间序列处理、模式识别和信号预测等方面的优异性能。尽管忆阻技术前

kiwi8的博客 207

互联网的发展简史—web

互联网是我现在生活所离不开的一个东西,但是你知道互联网的前世今生吗?本文将讲解互联网的发展史,以及很火的元宇宙概念。

yj11290301的博客 3565

js 创建对象的几种方式

在 js 中可以通过 Object 构造函数或对象字面量来创建对象,但是这些方式在创建具有同样接口的多个对象需要重复编写很多代码。因此,便有了几种常见的创建对象的模式,它们分别有着各自的优缺点,可以根据不同需求选择不同的模式。

ec50n9 的博客 2818

用 SAP Fiori Launchpad Content Manager 做目录传输:把 Catalog 变更稳稳送到目标系统

摘要:SAP Fiori项目中,目录传输是确保应用一致交付的关键环节。开发团队常遇到目录在不同系统/客户端间不一致的问题,核心在于理解Launchpad内容管理的两种作用域:系统级(/UI2/FLPCM_CONF)使用workbench请求跨系统传输,客户端级(/UI2/FLPCM_CUST)通过customizing请求按SCC4设置传输。混淆作用域会导致目录分叉,如系统级目录被客户端本地修改后形成独立副本。官方推荐使用Content Manager而非过时的Launchpad Designer,并强调手

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

JavaScript中创建对象的几种方式

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

老曹的博客 917

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

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

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

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

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

LLL3189860667的博客 981

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

js创建对象的几种模式

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

clh918的博客 253

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

初学JavaScript:JS中创建对象的模式(工厂模式/构造函数模式/原型模式/组合模式)

工厂模式 构造模式 原型模式 组合模式

lalala_dxf的博客 2187

JavaScript六种比较常见的原型创建对象的方法

1.传统原型法:a. 当完成一个函数声明之后, js引擎会自动的创建一个对象, 这个对象表示函数对象.函数对象会有一个属性 prototype, 他指向一个对象, 这个对象也是自动创建出来的, 这个对象就是函数的原型对象.原型对象也有一个属性: constructor , 表示构造器,他会指向函数对象.b. 任何的函数都会有原型对象. 只是, 我们只关注和研究构造函数的原型对象, 普通函数的原型对...

LY_code的博客 1128

JavaScript中创建对象的几种模式

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

demonHunter1234的博客 236

图解JavaScript原型模式创建对象

JavaScript面向对象这一块的底层原理是很难掌握的,基本是看了忘,忘了再看的循环过程。最近深入理解new运算符底层原理的时候,又看了一遍关于面向对象这一块的知识点,从而有了新的认识。本篇只讨论基于原型模式创建对象,对涉及到的知识点只做简单补充,后续进行细化和整体的对比。 function Person() { } Person.prototype.name = "...

一起的远方的博客 536

js - 创建对象的几种方式(工厂模式、构造函数模式、原型模式)

创建对象的模式 工厂模式 做法:内部创建一个对象,并未对象属性赋值并且返回 缺点:解决创建多个相识对象的问题,但不能识别创建的对象的类型 构造函数模式 做法:直接将属性和方法赋值给 this 对象,没有 return 语句 缺点:对象不是共用方法和属性,每 new 一次对象就要创建一个内存,超出性能消耗 原型模式 做法:通过 prototype 为对象添加属性 缺点:每个实例都共享属性方法,实例中修改对象属性会影响到其他实例 组合使用构造函数模式和原型模式 做法:构造函数模式用于定义实

qq_39150360的博客 490

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创建对象常用的几种方法

创建对象常用的6种方法 1.使用new关键字 var a = new Object(); 2.通过字面量创建对象 var b = { name:'张三'; } 3.工厂模式 function aa(name,age){ //1) 原材料 var bb = new Object() bb.name = name; bb.age = age //2)加工 bb.create = function(){ console.log('我的名字

x94410891的博客 872

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

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

weixin_33785108的博客 187

js中创建对象的几种方式

1、字面量方式创建,也就是我们所常说的基本创建方式 但是这个方式有一个缺点,就是要创建多个对象的时候,需要每一个对象里面的属性都要重新声明一下,直接向中添加属性和方法,这样就造成了代码的冗余,而且这样创建对象的话,也必须先知道对象的属性和方法,否则无法创建; var object = new Object(); object.name='lili'; //向对象中添加属性和方法 ob...

lhxsirky的博客 660
上一篇: ActiveMQ简述--源自技术
下一篇: <c:choose>标签的使用--源自技术
MyJava_Dx
博客等级 码龄11年 1粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值