JavaScript(对象的创建模式)
JavaScript和其他语言略有不同,在JavaScript中,引用数据类型都是对象(包括函数)。不过,在JavaScript中并没有“类”的概念,这决定了在JavaScript中不能直接来定义“类”以及继承"类”。
不过在JavaScript中却可以通过构造函数来实现创建“类”和“实例对象”,在这一点上它与java中“类”的构造函数作用类似。
接下来我们来看一下对象的创建模式:
1.Object构造函数模式
var obj=new Object();
obj.name='mmzkyl';
obj.age=18;
obj.show=function(){
console.log("hi 我是"+this.name);
}
obj.show();
通过这种模式虽然可以较为简单的创建对象,但是却无法大量创建对象
2.对象字面量模式
var obj={
name:'mmzkyl',
age:18,
show:function(){
console.log("hi 我是"+this.name);
}
}
obj.show();
这种对象创建模式与第一种在本质上来说并没有什么大的区别,不过相比于第一种创建方式,这种创建方式较为简洁一些。
3.工厂模式
function Person(name,age)
{
var obj=new Object();
obj.name=name;
obj.age=age;
obj.show=function(){
console.log("hi 我是"+this.name);
}
return obj;
}
var person=Person('mmzkyl',18);
person.show();
这种创建方法相比于前面两种有了很大的进步,最明显的莫过于这种创建方式可以大量的实例化对象。
这虽然解决了一些问题,但是却存在着一些问题,看如下代码:
function Dog(name,age)
{
var obj=new Object();
obj.name=name;
obj.age=age;
obj.show=function(){
console.log("汪汪汪");
}
return obj;
}
var dog=Dog('mary',2);
dog.show();
在这里我又创建了一个关于狗的对象。
接下来,我们来看一下他们实例化对象的类型:
console.log(person instanceof Person,person instanceof Object);
console.log(dog instanceof Dog,dog instanceof Object);

由输出我们可以发现问题所在,我们原来的目标是创建不同的对象,但是目前我们所得到的对象类型却都是一样的,这产生了一个对象识别的问题。
其产生原因也很简单,上述我们创建对象时都是通过"new Object()"来创建,所以创建的对象一定都是Object的实例化对象,无法识别对象类型也是应该的。
4.构造函数模式
function Person(name,age){
this.name=name;
this.age=age;
this.show=function(){
console.log("hi 我是"+this.name);
}
}
var person=new Person('mmzkyl',18);
person.show();
这种创建模式与上一种创建模式略有不同:
a.没有显式的使用new Object()来创建对象
b.直接将属性和方法赋值给了this对象
c.没有return语句。
实际上,这种创建模式会经历以下几个步骤:
a.创建一个新的对象
b.将构造函数的作用域赋值给新对象(因此this便指向这个新对象了)
c.执行构造函数中的代码
d.将新对象返回
虽然需要经历这些步骤,但是有一些步骤我们是无法看到的。
此外,通过这种方法创建的对象若要实例化则必须使用new操作符。
同样的,我再创建一个关于狗的对象:
function Dog(name,age){
this.name=name;
this.age=age;
this.show=function(){
console.log("汪汪汪");
}
}
var dog=new Dog('mary',2);
dog.show();
现在,我们再来测试一下他们对象的类型:
console.log(person instanceof Person,person instanceof Object);
console.log(dog instanceof Dog,dog instanceof Object);

从这里就可以看到这种对象的创建模式可以解决对象的识别问题。
但是构造函数也存在着一些问题,构造函数的实例化对象时,每实例化一个对象都要将方法在每一个实例上重新创建一遍,这无疑是积极浪费资源的。
对于这个问题,我们可以通过如下方法来进行解决:
function Person(name,age){
this.name=name;
this.age=age;
this.show=show;
}
function show(){
console.log("hi 我是"+this.name);
}
var person=new Person('mmzkyl',18);
person.show();
我们在全局作用域创建一个函数,将函数赋值给对象内的属性,这样就可以解决浪费资源的问题。
但是,问题又来了,如果要创建很多对象,每个对象又有着各自的方法,这无疑会严重污染全局作用域;此外,这样的创建方式已经毫无封装性可言了。
5.构造函数+原型的组合模式
function Person(name,age){
this.name=name;
this.age=age;
}
Person.prototype.show=function(){
console.log("hi 我是"+this.name);
}
var person=new Person('mmzkyl',18);
person.show();
在这种模式中,实例化对象的属性都是在构造函数中定义的,而需要共享的属性以及方法则是在原型中定义的。
在JavaScript中还有一些其他的对象创建模式,不过由于我还比较菜,对那些还不太熟悉,就不在这里说了。
JavaScript(对象的创建模式)的更多相关文章
- Javascript对象的创建模式 -- 深入了解Javascript
/* 一.模式1:命名空间(namespace) 优点:减少全局命名所需的数量,避免命名冲突或过度 */ // 更简洁的方式 var MYAPP = MYAPP || {}; //定义通用方法 MYA ...
- javascript 对象的创建与继承模式
针对JS高级程序设计这本书,主要是理解概念,大部分要点源自书内.写这个主要是当个笔记加总结 存在的问题请大家多多指正! 6.1理解对象 创建对象的两个方法(暂时) //第一种,通过创建一个Object ...
- JavaScript 对象的创建
Object类型是JavaScript中使用最多的一种类型.创建Object实例的方式有多种,接下来一一列举. 1. Object构造函数 person1的friends属性修改影响了person2的 ...
- JavaScript对象的创建
原文 简书原文:https://www.jianshu.com/p/6cb1e7b7e379 大纲 前言 1.简单方式创建对象的方法 2.工厂模式创建对象 3.构造函数模式创建对象 4.原型模式创建对 ...
- JavaScript对象的创建之使用json格式定义
json: javascript simple object notation. json就是js的对象,但是它省去了xml中的标签,而是通过{}来完成对象的说明. 定义对象 var person = ...
- Javascript 对象的创建和属性的判定
1. 创建对象的方法: 直接使用new 对Object对象进行操作,即对Object 对象进行实例化 <!DOCTYPE html> <html lang="en" ...
- js对象的创建模式
方式一: Object构造函数模式 * 套路: 先创建空Object对象, 再动态添加属性/方法 * 适用场景: 起始时不确定对象内部数据 * 问题: 语句太多 /* 一个人: name:" ...
- JavaScript 对象的创建和操作
<script> // 对象是属性的无序集合,每个属性都是一个名/值对. 属性名称是一个字符串. // 对象种类 // 内置对象(nativ ...
- JavaScript对象的创建之基于构造方法+原型方式
为了解决原型所带来的问题,此处需要通过组合构造方法和原型来实现对象的创建,将属性在构造方法中定义,将方法在原型中定义.这种有效集合了两者的优点,是目前最为常用的一种方式. function Perso ...
随机推荐
- JDK 14的新特性:更加好用的NullPointerExceptions
JDK 14的新特性:更加好用的NullPointerExceptions 让99%的java程序员都头痛的异常就是NullPointerExceptions了.NullPointerExceptio ...
- Error: Can't find Python executable "G:\Python27"
错误如题,node-gyp官网介绍不够详细,应设置python.exe的具体绝对路径,如下所示: npm config set python G:\Python27\python.exe 转载于:ht ...
- 使用SWIG将C++接口转换成Java接口
PS:此文章仅作为个人记录使用,代码属于私密,故无法公开: 以C++类classifier为例,文件保存于百度网盘 https://pan.baidu.com/s/1c2AwhaS(需密码) 系统:U ...
- Clickhouse 条形图📊函数展示
Clickhouse 条形图
- 2019年 ICPC亚洲区预赛(上海赛区)总结
首先,我要说,我输了,输给了自己的无知,输给了自己的心态与实力. 上海区域赛,打铁而归,最终还是没有比过自己SLG的朋友.要说什么呢?实力的差距,还是说给自己的失败找借口?不能进入金牌区,为什么铜牌区 ...
- Codeforces Round #639 (Div. 2)
Codeforces Round #639 (Div. 2) (这场官方搞事,唉,just solve for fun...) A找规律 给定n*m个拼图块,每个拼图块三凸一凹,问能不能拼成 n * ...
- D. Mysterious Present DAG dp
https://codeforces.com/problemset/problem/4/D 这个题目比较简单,就是一个DAG模型,这个可以看看紫书学习一下, 我这次是用dp来写的,用记忆化搜索也许更好 ...
- 推荐算法_CIKM-2019-AnalytiCup 冠军源码解读
最近在帮一初创app写推荐系统,顺便学习一波用户兴趣高速检索的冠军算法. 写总结前贴出冠军代码的git地址:https://github.com/ChuanyuXue/CIKM-2019-Analyt ...
- 闲来无事做个C#小项目——1
2020-05-10 12:25:47 项目背景就是最近和一些朋友在玩一个游戏,游戏中有一个囤货的东西,就是买进卖出的,然后为了方便计算,所以就先写一个简单的计算器用来算账, 这是界面图(最初形态,没 ...
- 【杂谈】Disruptor——RingBuffer问题整理(一)
纯CAS为啥比加锁要快? 同样是修改数据,一个采用加锁的方式保证原子性,一个采用CAS的方式保证原子性. 都是能够达到目的的,但是常用的锁(例如显式的Lock和隐式的synchonized),都会把获 ...