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