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中还有一些其他的对象创建模式,不过由于我还比较菜,对那些还不太熟悉,就不在这里说了。

最新文章

  1. 沈逸老师PHP魔鬼特训笔记(3)
  2. 使用开源库MagicalRecord操作CoreData
  3. SGU 119.Magic pairs
  4. javascript遍历select下拉框判断其中值是否与指定值相等
  5. Excel阅读模式/单元格行列指示/聚光灯开发 技术要点再分享
  6. CentOS 7 本地安装kubernetes
  7. python3读写csv文件
  8. mac 删除文件不经过废纸篓解决办法
  9. 模板引擎,中间件,spring AOP原理
  10. python 过滤文本中的标点符号(转)
  11. Android 多线程编程
  12. 计算机基础-BIOS
  13. 如何在Qt Creator中导入图标资源
  14. Nios II——定制自己的IP1之Nios接口类型
  15. JavaScript递归方法 生成 json tree 树形结构数据
  16. 《编写高质量代码改善JavaScript程序的188个建议》读书笔记
  17. 打豪车应用:uber详细攻略(附100元优惠码)
  18. 内容显示在HTML页面底端的一些处理方式
  19. redis 常用的server的命令
  20. MongoDB authentication failed

热门文章

  1. Spring5参考指南:基于注解的容器配置
  2. SSH公钥登录和RSA非对称加密
  3. 正则表达式(grep,awk,sed)和通配符
  4. Linux下必知必会文件和目录
  5. Netflix:当你按下“播放”的时候发生了什么?
  6. C语言编程入门题目--No.10
  7. 图论--拓扑排序--HDU-1285确定比赛名次
  8. SpringBoot返回JSON日期格式问题
  9. B. Heaters 思维题 贪心 区间覆盖
  10. C#并发编程之初识并行编程