js创建对象的方法很多,每种都有不同的适用场景,满足各种业务需求(都是屁话,写个业务用什么面向对象啊)
一种归纳了7种常见的 实际在js的设计模式中还有很多
第一种: Object构造函数创建
说明: 这是一个方法用的不多,跟字面量的方法很像,但是写法上复杂一些
优点: 书写简便
缺点: 不便以大量对象的批量生成
1 2 3 4 5 6 7 8 9 10
| var parson1 = new Object({ like: 'book' }) parson1.name = '小可爱' parson1.age = 18 parson1.show = function () { console.log(this.name) } parson1.show() console.log('parson1', parson1)
|
第二种: 字面量方式创建对象
说明: 两个字简单,最长用的创建对象的方法了把,但是实例的原型是Object(很尴尬)
优点: 书写简便
缺点: 不便以大量对象的批量生成
1 2 3 4 5 6 7 8 9
| var parson2 = { name: '小明', age: 48, show: function () { console.log(this.name) } } parson2.show() console.log('parson2', parson2)
|
第三种: 工厂模式创建对象
说明: 对象的原型还是Object,一种能够批量声明实例的方法,没有原型,没有实例之间都是独立的
优点: 可批量创建对象
缺点: 无法判断对象的类型
1 2 3 4 5 6 7 8 9 10 11 12
| function Parson3(name, age) { var o = new Object({ name, age }) o.show = function () { console.log(this.name) } return o } const parson3 = Parson3('小灰灰', 3) parson3.show() console.log('parson3', parson3)
|
第四种: 构造函数创建对象
说明: 终于有原型了,不过生成实例的时候需要添加new,不new的话this就会指向全局对象(浏览器是Window对象,node中式Global对象);
优点: 可批量创建对象,拥有自己的原型,能够用于判断对象的类型
缺点: 每个方法都要每个实例上重新创建一遍(方法指的是对象里面定义的函数),如果方法数量很多,就会占用很多不必要的内存
1 2 3 4 5 6 7 8 9 10
| function Parson4(name, age) { this.name = name this.age = age this.show = function () { console.log(this.name) } } var parson4 = new Parson4('乔治', 2) parson4.show() console.log('parson4', parson4)
|
第五种: 原型模式创建对象
说明: 很坑,实例化之后直接输出实例什么都没有,因为所有的属性和方法都在实例的__proto__里面;当为对象实例添加一个属性时,这个属性就会屏蔽原型对象中保存的同名属性。
优点: 可批量创建对象,拥有自己的原型,方法不会再实例上创建
缺点: 不能自定义对象属性的值,每个实例都拥有相同的属性和方法
1 2 3 4 5 6 7 8 9 10 11
| function Parson5() { } Parson5.prototype.name = '小红红' Parson5.prototype.age = 30 Parson5.prototype.show = function () { console.log(this.name) } var parson5 = new Parson5() parson5.show() console.log('parson5', parson5) console.log('parson5.name', parson5.name) console.log('parson5.age', parson5.age)
|
第六种: 组合方式创建对象(构造函数模式+原型模式)
说明: 对象的属性使用构造函数模式,对象的方法使用原型模式(完美)
优点: 可批量创建对象,拥有自己的原型,方法不会再实例上创建,能够自定义对象的属性
缺点: 需要理解前五种创建对象的方法才能理解这种模式的优点
1 2 3 4 5 6 7 8 9 10
| function Parson6(name, age) { this.name = name this.age = age } Parson6.prototype.show = function () { console.log(this.name) } var parson6 = new Parson6('佩奇', 1) parson6.show() console.log('parson6', parson6)
|
第七种: ES6提供的class关键字创建对象
说明: 感觉像是组合方式的语法糖,优缺点一致
优点: 组合方式的优点全都有
缺点: 需要对ES6有一定程度的了解,对浏览器的兼容不好,一般配合Babel一起使用
1 2 3 4 5 6 7 8 9 10 11 12
| class Parson7 { constructor(name, age) { this.name = name this.age = age } show() { console.log(this.name) } } var parson7 = new Parson7('小猪猪', 3) parson7.show() console.log('parson7', parson7)
|
[测试代码]