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 ...
随机推荐
- 使用ExecutorService来停止线程服务
文章目录 使用shutdown 使用shutdownNow 使用ExecutorService来停止线程服务 之前的文章中我们提到了ExecutorService可以使用shutdown和shutdo ...
- Navicat premium15安装破解教程
Navicat premium15安装破解教程 注意:安装之前请卸载干净navicat,不要覆盖安装 1.去官网下载Navicat premium15的安装包 官网地址:https://www.nav ...
- 【思科】OSI和TCP/IP分层
OSI参考模型 20世纪70年代,ISO创建OSI参考模型,希望不同供应商的网络能够相互协同工作 OSI:开放系统互联 open system interconnection ISO:国际标准化组织 ...
- JS代码规范
JS代码规范 空格 二元运算符两侧必须有一个空格,一元运算符与操作对象之间不允许有空格. var a = !arr.length; a++; a = b + c; 复制代码 用作代码块起始的左花括号 ...
- JAVA编程思想 Ch3.6题
练习6:在练习5的基础上,创建一个新的Dog索引,并对其赋值为Spot对象.测试用==和equals()方法来比较引用结果. public class quan { String name; Stri ...
- Nginx模块开发(1)————类helloworld
Nginx看了一点了,准备写个helloworld试试,觉得只看书的话很多东西都乱乱的,晕晕的,印象不深. 我的helloworld模块的目的就是:能够在浏览器里输入http://你的ip地址/lcw ...
- 纯django开发最完美博客
2020年5月打造最时尚博客系统教程 为了学习速度,集中精力学习django和博客开发, 没有使用其它框架,也没有使用css预处理等 这样学起来最方便, 博客前后端都完成, www.duanshuil ...
- Java的类锁、对象锁和方法锁
在Java中,对于synchronized关键字,大家看到的第一反应就是这个关键字是进行同步操作的,即得名"同步锁". 当用它来修饰方法和代码块时,默认当前的对象为锁的对象,即对象 ...
- asyncio异步编程【含视频教程】
不知道你是否发现,身边聊异步的人越来越多了,比如:FastAPI.Tornado.Sanic.Django 3.aiohttp等. 听说异步如何如何牛逼?性能如何吊炸天....但他到底是咋回事呢? 本 ...
- golang关键字select的三个例子, time.After模拟socket/心跳超时
golang关键字select的三个例子, time.After模拟socket/心跳超时 例子1 select会随机选择一个可执行的case // 这个例子主要说明select是随机选择一个 ...