Javascript创建对象有哪几种方式
- 对象是由属性和方法组成的,指的是一个具体的事物,属性是指事物的具体特征,方法是指事物的行为。
创建对象的方法有以下几种:
-
new Object()
-
对象字面量
-
工厂模式
-
构造函数
-
原型对象的方式
1.1Object的方式
-
先实例化一个空对象,然后属性和方法
语法:
var 对象名 = new object(); 对象.属性=值; 对象.方法 = function(){};
-
优缺点
Object构造函数可以来创建单个对象,但是这个方式明显的缺点使用同一个接口创建很多对象,会产生大量重复的代码,如上边的代码每创建一个类似于person的对象就会重复上面的写法,代码比较冗余。
-
1.2对象字面量
对象字面量是对象定义的一种简写形式,简化创建包含大量的属性和方法的对象过程。
语法:
var 对象 = {
属性:值,
方法:function(){}
}
-
对象字面量和new object()方式创建对象的一样会造成代码的冗余,因此为了解决这种代码冗余引入了工厂模式。
1.3工厂模式
工厂模式的出现是为了解决new object()和对象字面量创建对象时会产生大量代码的冗余,可以通过工厂模式或者构造函数对以上代码进行优化,解决冗余问题提高代码的重用性,工厂模式是软件工程领域的一种设计模式,工厂模式抽象了创建对象的过程,工厂模式通过函数封装创建对象的细节。
(自己的理解,因为函数本身可以多次调用,工厂模式的本质上就是利用函数本身能够多次调用的特点,在函数内部创建对象,将对象内部变化的值作为函数的参数【属性值】,将对象作为返回值在函数结束时候返回,是对创建对象的方式进行的封装,是一种利用函数解决问题的方式,是函数和new Object 方式的结合)
语法:
//第一步:声明工厂函数,通过工厂函数创建对象 function 函数名(参数1,参数2,...){ let obj = new Object(); 对象.属性1 = 参数1; 对象.属性2 = 参数2; 对象.方法 = function(){}; return obj; } //第二步:调用工厂函数,得到对象 var 对象 = 函数(实参1,实参2); //调用函数内部的方法 对象.方法();
对代码构建过程的理解;
- 首先构建一个函数(函数的特点能够多次调用)
- 在函数内部通过 new object()利用对象名.方法名给他们赋值,因为值会变化所以利用函数的参数进行传值
- 难点在于要在调用函数时拿到对象,刚好函数返回值能够做到
- 调用生成对象,var girl = obj 就是将对象赋值给一个新的变量 girl.display()本质上就等于obj.dispaly()
1.4构造函数
构造函数和普通函数的区别:
-
调用方式不同
普通函数调用方式:直接调用
//普通函数调用方法 function foo(){} foo()
构造函数调用方式
构造函数调用方式:需要借助new关键字进行调用
//构造函数的调用方式
function Foo(){}
var f = new Foo()
-
作用不一样
构造函数的作用是用来新建实例化对象,普通函数主要是用来实现某些功能
-
首字母大小写习惯不同
一般规定构造函数首字母函数名称需要大写
普通函数用小写
-
函数中this的指向不同
普通函数中的this在严格模式下指向this在非严格模式下指向window
构造函数中的this指向创建的对象实例
构造函数的方式是为了解决重复实例化多个对象的问题但是没有解决对象识别的问题
构造函数函数名称建议采用大驼峰的方式
构造函数是一种特殊的函数,我们可以把对象中公共的属性和方法抽取出来封装到这个函数中
然后通过new来实例化生成对象,并且可以通过构造函数的参数给对象的属性赋值。
语法:
//声明构造函数
function 函数名 (参数1,参数2,...)
{
this.属性1 = 参数1;
this.属性2 = 参数2;
this.方法 = function (){}
}
//实例化对象
var 对象 = new 函数名(参数1,参数2);
``
**自己的理解:构造函数的解决方式是在工厂模式上的一种优化,仅仅是优化因为this指向的是实例化的对象虽然不知道不指向有什么明显的坏处,但是指向或许有好处吧**
**1.5原型对象**
原型对象用来解决构造函数的问题,构造函数虽然好用,但是存在内存浪费的问题,同一构造函数实例化出来的实例化对象,都会给自己的成员方法分配内存空间,但是实际上这些成员方法都是相同的,这样就造成了内存的浪费
语法:
```js
//声明构造函数
function 函数名(参数1,参数2,...){
this.属性1 = 参数1;
this.属性2 = 参数2;
}
//将公共的方法定义在原型链
函数名.prototype.方法 = function(){}
//第三步:实例化对象
var 对象 = new 函数名(实参1,实参2);
自己的理解:因为对象的原型是__proto__函数的原型是prototype将公共的方法放在自己的原型上就不需要在每次新建时候去开辟内存空间可以解决构造函数需要不断开辟内存空间的问题。