JavaScript:如何实现Line类构造函数以接收Card类对象
嘿,作为JS新手能想到这种灵活的构造函数需求很棒!我来给你两种实现方案,分别对应不同的校验需求场景~
首先先确认下我们基于的Card类示例(方便你对照):
class Card { constructor(color, number) { this.color = color; this.number = number; } }
方案一:宽松兼容型(自动处理无效输入)
这个方案会自动过滤掉非Card实例的参数,并且最多保留前4个有效Card,即使你不小心传多了也不会出错:
class Line { constructor(...cards) { // 只保留Card实例的参数 const validCards = cards.filter(card => card instanceof Card); // 限制最多4个Card this.cards = validCards.slice(0, 4); } }
用法示例
// 0个Card的情况 const line0 = new Line(); console.log(line0.cards); // 输出:[] // 2个Card的情况(就是你想要的用法) const card1 = new Card('红', 5); const card2 = new Card('蓝', 3); const line1 = new Line(card1, card2); console.log(line1.cards); // 输出:[Card { color: '红', number: 5 }, Card { color: '蓝', number: 3 }] // 传超过4个Card的情况(自动截断) const card3 = new Card('绿', 7); const card4 = new Card('黄', 2); const card5 = new Card('黑', 1); const line2 = new Line(card1, card2, card3, card4, card5); console.log(line2.cards.length); // 输出:4 // 混入非Card参数的情况(自动过滤) const line3 = new Line(card1, '不是Card', 123); console.log(line3.cards); // 输出:[Card { color: '红', number: 5 }]
方案二:严格校验型(不符合要求直接报错)
如果你希望确保传入的参数必须全是Card实例,且数量不能超过4个,那可以用这个严格版本,不符合条件会直接抛出错误,方便你快速排查问题:
class Line { constructor(...cards) { // 校验每个参数都是Card实例 for (const card of cards) { if (!(card instanceof Card)) { throw new Error(`传入的参数不是Card实例:${card}`); } } // 校验数量不超过4个 if (cards.length > 4) { throw new Error(`最多只能传入4个Card,你传了${cards.length}个`); } // 把有效Card存到实例上 this.cards = [...cards]; } }
用法示例
const card1 = new Card('红', 5); const card2 = new Card('蓝', 3); // 正常用法 const lineValid = new Line(card1, card2); // 没问题 // 传非Card参数会报错 // const lineInvalid1 = new Line(card1, '错误参数'); // 抛出错误:传入的参数不是Card实例:错误参数 // 传超过4个会报错 // const lineInvalid2 = new Line(card1, card2, card3, card4, card5); // 抛出错误:最多只能传入4个Card,你传了5个
两种方案可以根据你的实际需求选,新手的话先用方案一比较省心,等后续需要严格校验了再换成方案二就好~
内容的提问来源于stack exchange,提问作者user9758730
相关产品推荐
相关产品推荐

