今天在知乎上,看到一位大神这样解释new的操作,很详细,通俗易懂,前端面试中也会涉及到这方面的问题,所以分享来大家一起学习学习,膜拜大神的思维,很赞!
今天我从「省代码」的角度来讲 new。
---------------------------
想象我们在制作一个策略类战争游戏,玩家可以操作一堆士兵攻击敌方。
我们着重来研究一下这个游戏里面的「制造士兵」环节。
一个士兵的在计算机里就是一堆属性,如下图:
我们只需要这样就可以制造一个士兵:
var 士兵 = {ID: 1, // 用于区分每个士兵兵种:"美国大兵",攻击力:5,生命值:42, 行走:function(){ /*走俩步的代码*/},奔跑:function(){ /*狂奔的代码*/ },死亡:function(){ /*Go die*/ },攻击:function(){ /*糊他熊脸*/ },防御:function(){ /*护脸*/ }
}兵营.制造(士兵)
如果需要制造 100 个士兵怎么办呢?
循环 100 次吧:
var 士兵们 = []
var 士兵
for(var i=0; i<100; i++){士兵 = {ID: i, // ID 不能重复兵种:"美国大兵",攻击力:5,生命值:42, 行走:function(){ /*走俩步的代码*/},奔跑:function(){ /*狂奔的代码*/ },死亡:function(){ /*Go die*/ },攻击:function(){ /*糊他熊脸*/ },防御:function(){ /*护脸*/ }}士兵们.push(士兵)
}兵营.批量制造(士兵们)
哎呀好简单。
上面的代码存在一个问题:浪费了很多内存。
用原型链可以解决重复创建的问题:我们先创建一个「士兵原型」,然后让「士兵」的 __proto__ 指向「士兵原型」
var 士兵原型 = {兵种:"美国大兵",攻击力:5,行走:function(){ /*走俩步的代码*/},奔跑:function(){ /*狂奔的代码*/ },死亡:function(){ /*Go die*/ },攻击:function(){ /*糊他熊脸*/ },防御:function(){ /*护脸*/ }
}
var 士兵们 = []
var 士兵
for(var i=0; i<100; i++){士兵 = {ID: i, // ID 不能重复生命值:42}/*实际工作中不要这样写,因为 __proto__ 不是标准属性*/士兵.__proto__ = 士兵原型 士兵们.push(士兵)
}兵营.批量制造(士兵们)
有人指出创建一个士兵的代码分散在两个地方很不优雅,于是我们用一个函数把这两部分联系起来:
function 士兵(ID){var 临时对象 = {}临时对象.__proto__ = 士兵.原型临时对象.ID = ID临时对象.生命值 = 42return 临时对象
}士兵.原型 = {兵种:"美国大兵",攻击力:5,行走:function(){ /*走俩步的代码*/},奔跑:function(){ /*狂奔的代码*/ },死亡:function(){ /*Go die*/ },攻击:function(){ /*糊他熊脸*/ },防御:function(){ /*护脸*/ }
}// 保存为文件:士兵.js
然后就可以愉快地引用「士兵」来创建士兵了:
var 士兵们 = []
for(var i=0; i<100; i++){士兵们.push(士兵(i))
}兵营.批量制造(士兵们)
JS 之父创建了 new 关键字,可以让我们少写几行代码:
只要你在士兵前面使用 new 关键字,那么可以少做四件事情:
function 士兵(ID){this.ID = IDthis.生命值 = 42
}士兵.prototype = {兵种:"美国大兵",攻击力:5,行走:function(){ /*走俩步的代码*/},奔跑:function(){ /*狂奔的代码*/ },死亡:function(){ /*Go die*/ },攻击:function(){ /*糊他熊脸*/ },防御:function(){ /*护脸*/ }
}// 保存为文件:士兵.js
然后是创建士兵(加了一个 new 关键字):
var 士兵们 = []
for(var i=0; i<100; i++){士兵们.push(new 士兵(i))
}兵营.批量制造(士兵们)
new 的作用,就是省那么几行代码。
转自=study-fe
本文发布于:2024-02-02 00:44:23,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170681113940297.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |