在我们开发过程中,当需要创建多个包含有多个相同的属性和方法的对象时,我们可以使用自定义构造函数和原型(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
以上仅为本人理解,如有错误之处,烦请各位大佬指正!!!