一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第12天,点击查看活动详情。
js中创建对象方式的总结
一共有10种方式。
1.new Object();
缺点:步骤多
2. 字面量:var 对象名={};
缺点:如果反复创建多个对象,代码会很冗余
3.工厂函数方式;
function createPerson(name,age){
var o=new Object();
o.name=name;
o.age=age;
o.say=function(){alert(this.age)}
return o;
}
var m=createPerson('静静',18);
缺点:本质还是Object(),将来无法根据对象的原型对象准确判断对象的类型
4.构造函数方式
2步:
- 先用构造函数定义一类对象的统一属性构造和方法;
- 再用new调用构造函数,反复创建相同属性结构,不同属性值的多个对象;
缺点:如果构造函数种包含方法,则重复创建,浪费内存
function Person(name,age){
this.name=name;
this.age=age;
this.say=function(){alert(this.age)}
}
var m=new Person('静静',18);
5.原型对象方式
先创建完全相同的对象,再给子对象添加个性化属性;
function Person(){}
Person.prototype.name='静静';
Person.prototype.age=18;
Person.prototype.say=function(){alert(this.age)}
}
var m1=new Person()//创建一个实例m1
m1.name='小明'//禁止修改共有属性
var m2=new Person();//创建第二个实例m2
m1.name='小红'//同上
缺点:步骤繁琐
6.混合模式
先创建完全相同的对象,再给子对象添加个性化属性
缺点:不符合面向对象封装思想
7. 动态混合
先创建完全相同的对象,再给子对象添加个性化的属性
缺点:语义不符,其实if只在创建第一个子对象时有意义
8.寄生构造函数
构造函数里调用其他的构造函数
缺点:可读性差
9.es6class
定义时:
class class名{
contructor(){
...
}
say=function(){...}
}
直接放在class{}内的方法,是保存在原型对象中的
使用时:
和使用旧的构造函数一样
var 对象名=new class名(属性值,...)
放在contructor构造函数里的属性如果子对象想访问的话,要用this,比如:this.name=...,this.age=...;
而之外的是属于原型上的,可以和子对象们共同使用,而子对象里的又可以添加自己私有的属性和方法;
直接写在class里面的方法,可以直接这样写,eg:say(){},子对象调用的时候就像调用自己的方法一样,子对象.say(),就可以;
比如下面这个就是,contructor里既既没有接受参数,也没有使用this,所以子对象是没有构造里面的属性的. 里面的say其实是个属性,属性值是个函数,因此直接就可以在子对象里看到.
想要子对象直接可以使用父对象中的属性的话,并且传参数, 需要class里的custructor里写上形参,里面的属性用this.
如下:
10.稳妥构造函数
不用闭包,不用this,不用new,安全,可靠
缺点:使用了闭包,容易造成内存泄漏