小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
前言
没有枪没有炮敌人给我们造,没有对象我们自己new,手动狗头!
常用的内置对象:
- Object
- Array
- Date
- Function
- RegExp
创建对象的几种方式
1. 普通方式
栗子:
const player = new Object() // 创建一个空对象
player.color = 'white'
player.start = function(){
console.log('白色开始下棋')
}
缺点
容易出现代码冗余
优化
我们可以引入工厂模式:
function CreateObject(color){
const player = new Object()
player.color = color
player.start = function(){
console.log(`${color}开始下棋`)
}
return player
}
const white = CreateObject('white')
const black = CreateObject('black')
const red = CreateObject('red')
用 new Object() 进行创建有一点缺点就是我们无法明确 创建出来的对象有什么类型,无法直观的进行维护
2. 构造函数/实例
什么是函数?
按照犀牛书的说法,函数简单的说就是重复执行的代码块。函数是这样的一段JavaScript 代码,它只定义一次,但可能被执行或调用任意次。
什么是构造函数:
通过 new 函数名,来实例化对象的函数叫构造函数。任何的函数都可以作为构造函数存在。之所以有构造函数与普通函数之分,主要从功能上进行区别的,构造函数的主要 功能为 初始化对象,特点是和new 一起使用。
new就是在创建对象,从无到有,构造函数就是在为初始化的对象添加属性和方法。构造函数定义时首字母大写(规范)。
构造函数的缺点:
通过this添加的属性和方法,总是指向当前对象的,所以在实例化的时候,通过this添加的属性和方法都会在内存中赋值一份造成内存的浪费。。。
构造函数的优点:
我们修改了任何一个对象的属性,并不会影响其他的方法,实例化的时候是在内存中赋值了一次。。。
这是不是真的? 让我们输出一下就知道了
function company() {
this.start = function(){
console.log('白色开始下棋')
}
}
const a = new company()
const b = new company()
a.start === b.start // false
3. 原型对象
首先我们先看一下下面的代码输出:
function company(color) {
this.color = color
}
// 在 company 的原型对象下进行设值
company.prototype.start = function(){
console.log('颜色')
}
const a = new company('a')
const b = new company('b')
a.start === b.start // true
无论我们new多少个 company 实例出来,xxx.start === xxx.start 始终等于 true
为什么呢?我们这样输出的时候, start 始终在原型链上,我们实例化的方法都是指向 prototype.start 所以会设置为true
通过原型对象进行赋值的好处是什么?坏处又是什么?
好处:
通过原型的方式,每生成的一个实例,都不会在内存中开辟一块新的存储空间
坏处:
不利于代码的维护
4. 静态属性
是绑定在构造函数上的属性⽅法,需要通过构造函数访问
先给大家一个小栗子
class Test {
static age add(){
if(!Test.age) Test.age = 0
Test.age ++ //静态属性
}
}
Test.age // undefined -- 此时 age还未被赋值
var c1 = new Test() // 初始化 Test
c1.add() // 为age进行赋值
c1.age // undefined
Test3.age // 1
或者
function Player(){
if(!Player.num){
Player.num = 0
}
Player.num++ //静态属性
}
var p1 = new Player()
var p2 = new Player()
var p3 = new Player()
Player.num // 3
总结
我们归纳了四种创建对象的方式,大家可以按照自己的喜好去创建对象了,泪奔!
求关注!求收藏!求点赞