JS对象分类
分类
函数,数组,Date等他们都是对象,但是有什么不同呢?
Object所构造出来的对象都属于普通对象,而函数和数组他们就高人一等,他们都有各自特色的原型,如果自己的原型里找不到想要的,还能Object的原型里去找.
Array.prototype.__proto__ ===Object.prototype
true
构造函数和new的诞生
我们想要创造4个机器人这些机器人除了id不同,他们的技能是一样的都会射击.那我们可以利用for循环来做.
let robotList = []
let id = ['robot1', 'robot2', 'robot3', 'robot4']
for (let i = 0; i < 3; i++) {
robotList[i] = {
id: id[i],
shoot: function () { return 'shoot' }
}
}
console.log(robotList);
这样就能创建4个id不同的机器人,可是呢,这样每次循环的时候都会创建shoot新的函数
.robotList[0].getFly === robotList[1].getFly // 返回false为证.所以是非常占用内存的.
既然shoot三个函数是共有的,那么就把他们变成所有robot的共有属性
let robotList = []
let id = ['robot1', 'robot2', 'robot3', 'robot4']
let common = {
Shoot: function () { return 'shoot' }
}
for (let i = 0; i < 3; i++) {
robotList[i] = Object.create(common)
robotList[i].id = id[i]
}
console.dir(robotList[0])
这种方式不够紧凑,我来创建一个函数来制造robot
let robotList = []
let id = ['robot1', 'robot2', 'robot3', 'robot4']
let common = {
Shoot:function(){ return 'shoot'}
}
let creatRobot = function(id){
let obj=Object.create(common)
obj.id=id
return obj
}
for(let i=0;i<4;i++){
robotList[i]=createRobot(id[i])
}
这样只要调用creatRobot()就能制造出robot.但是还可以把那他们连在一起,变得更加紧密:
let robotList = []
let id = ['robot1', 'robot2', 'robot3', 'robot4']
function creatRobot(id){
let obj=Object.creat(creaetRobot.common)
obj.id=id
return obj
}
let creatRobot.common = {
Shoot:function(){ return 'shoot'}
construct:creatRobot // 加上构造函数的出厂钢印
}
for(let i=0;i<4;i++){
robotList[i]=creatRobot(id[i])
}
理解这些我们就可以心安理得得爬上去得到新一层的抽象,new
let robotList = []
let id = ['robot1', 'robot2', 'robot3', 'robot4']
let Robot =function(id){
this.id=id
}
Robot.prototype.shoot = function(){ return 'shoot'}
for(let i=0;i<4;i++){
robotList[i]=new Robot(id[i])
}
new简化了代码,替我们做这些事:
- 创造了一个空对象
- 给这个对象关联原型,原型的地址为Robot.prototype
- 给这个对象作为this这个关键字运行构造函数
- 最后返回了这个对象
可以看到Robot做了
- 函数本身负责给对象本身添加属性
- Robot.prototype 对象负责保存对象的共用属性
所以结论就是:
你是谁构造的,你的原型就是谁的prototype属性对应的对象
robotList[0].__proto__===Robot.prototype
true
而且每个对象都是构造出来的,他们__proto__里有构造函数的名字
Object.__proto__ === Function.prototype
true
Object.prototype=== Function.prototype
false