js创建多个相似对象并解决引用类型值冲突和prototype不能传参问题

在我们开发过程中,当需要创建多个包含有多个相同的属性和方法的对象时,我们可以使用自定义构造函数和原型(prototype)实现共享这些相同的属性和方法,当属性值为基本类型(如字符串、数值等)时,这样做是没问题的(代码如下)

function MyFn(){};      //构造函数

MyFn.prototype.name = '小明';
MyFn.prototype.age = 18;
MyFn.prototype.sayName = function(){
  console.log(this.name);
}

let fn1 = new MyFn();
fn1.sayName();          //运行MyFn构造函数的sayName方法,输出“小明”
console.log(fn1.age);   //18

let fn2 = new MyFn();
fn2.sayName();          //运行MyFn构造函数的sayName方法,输出“小明”
console.log(fn2.age);   //18

但是当我们给原型(prototype)赋值了引用类型,就会发现会出现不是我们想要的结果,随着fn1.colors的改变,fn2.colors的值也改变了(代码如下)

MyFn.prototype = {
  constructor: MyFn,
  name: '小明',
  age: 18,
  sayName: function(){
    console.log(this.name);
  },
  colors: ['red', 'blue']
}

let fn1 = new MyFn();
fn1.sayName();          //运行MyFn构造函数的sayName方法,输出“小明”
fn1.colors.push('green');     //给fn1.colors添加green
console.log(fn1.age);   //18
console.log(fn1.colors);    //输出["red", "blue", "green"]

let fn2 = new MyFn();
fn2.sayName();          //运行MyFn构造函数的sayName方法,输出“小明”
console.log(fn2.age);   //18
console.log(fn2.colors);    //输出["red", "blue", "green"],fn2.colors也随着fn1.colors改变了

这时候我们就需要将引用类型解除关联(如果需要同时改变可以不接触关联),实现每一个new出来的对象都有一个相对应的引用类型的值,同时也解决了原型(prototype)不能传参的问题。(代码如下)

//自定义构造函数
function AddFunction(name, age){
  this.name = name;                //利用构造函数传参
  this.age = age;
  this.colors = ['red', 'blue'];    //将引用类型属性放在构造函数中,避免相互冲突
};
//给原型赋值
AddFunction.prototype = {
  constructor: AddFunction,    //这里使用了字面量方式赋值,所以要将指针指向自定义的构造函数
  sayName: function(){         //添加方法
    console.log(this.name);
  }
};

let myFn1 = new AddFunction('小明', 18);
myFn1.colors.push('green');
myFn1.sayName();              //小明
console.log(myFn1.colors);    //["red", "blue", "green"]
console.log(myFn1.age);       //18

let myFn2 = new AddFunction('小红', 20,);
myFn2.colors.pop();
myFn2.sayName();              //小红
console.log(myFn2.colors);    //["red", "blue", "black"]
console.log(myFn2.age);       //20

以上仅为本人理解,如有错误之处,烦请各位大佬指正!!! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端小侯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值