1。构造函数实现类
2.原型方法实现类
3.两个混合实现类
(其实应该加一个,就是工厂方法的实现)
每种方法都有自己的优缺点,我简单说一下我的看法
1。工厂方法
function Person(name, age, work){
let obj=new Object();
obj.name=name;
obj.age=age;
obj.work=work;
return obj;
}
let a=new Person('ming', 18, 'teacher');
let b=new Person('ming', 18, 'teacher');
function Person(name, age, work){
this.name=name;
this.work=work;
this.age=age;
this.showName=function(){
console.log(this.name);
}
}
let a=new Person('ming', 18, 'teacher');
let b=new Person('ming', 18, 'teacher');
这样新建的对象对于类型来说并不明确,总是指向对象,而不是类
2。构造方法
function Person(name, age, work){
this.name=name;
this.work=work;
this.age=age;
this.showName=function(){
console.log(this.name);
}
}
let a=new Person('ming', 18, 'teacher');
let b=new Person('ming', 18, 'teacher');
用这个方法来实现类,相比工厂方法,构造函数有正确的指针,那为什么这个方法不行呢? let a=new Person('ming', 18, 'teacher');
let b=new Person('ming', 18, 'teacher');
a.showName===b.showName //false
请看下面的代码
let a=new Person('ming', 18, 'teacher');
let b=new Person('ming', 18, 'teacher');
a.showName===b.showName //false
function Person(name, age, work){
this.name=name;
this.work=work;
this.age=age;
this.showName=function(){
console.log(this.name);
}
}
let a=new Person('ming', 18, 'teacher');
let b=new Person('ming', 18, 'teacher');
两个对象相同的功能方法不一样,为什么最好相同呢? 因为对于一个类来说,方法都是同一组代码。如果new产生的两个对象中两个函数方法不相等,就会多占用一块内存,从而导致js的性能下降。 ,所以有一个通过原型方法实现的类
3。原型法
js中的每个构造函数都有一个prototype属性,prototype指向一个原型对象,而这个原型对象上的方法会被这个构造函数的
实例继承,所以我们可以使用构造函数的原型。必要的方法和属性
function Person(){
}
Person.prototype.name='ming';
Person.prototype.age=18;
Person.prototype.showName=function(){
console.log(this.name)
};
let a=new Person();
let b=new Person();
a.showName();//ming
b.showName();//ming
a.showName===b.showName //trhe
可以看到,对于原型上定义的方法,不同的实例可以访问同一个方法,而不是生成两个不同的地址但与构造函数相同的代码
当然,原型方法所实现的类也有一些不妥当的地方。第一点是通过传递参数来赋值比较困难。第二点也是最重要的一点是原型上定义的属性是一种浅层赋值,这对于基本类型来说很好。 ,但是对于数组或者对象来说,如果一个改变,另一个也会改变
function Person(){
}
Person.prototype.name='ming';
Person.prototype.age=18;
Person.prototype.arr=[12, 5, 8];
Person.prototype.showName=function(){
console.log(this.name)
};
let a=new Person();
let b=new Person();
a.arr[1]=99;
console.log(a.arr) //[12,99,8]
console.log(b.arr) //[12,99,8]
可以看到,当a改变arr数组中的某个值时,b也会同时改变,所以混合构造函数和原型似乎是最佳的写法
4。用于实现混合方法的类
使用混合方法来实现一个类,在我的理解中,就是将属性写在方法体中,就像构造函数来实现类一样,同一个方法的两个实例是不同的。
在原型上编写方法以实现更完整的类。
function Person(name, age){
this.name=name;
this.age=age;
}
Person.prototype.showName=function(){
alert(this.name)
}
Person.prototype.showAge=function(){
alert(this.age)
}
let a=new Person('ming', 18)
以上是我对es5实现类的理解。强烈推荐阅读红皮书中关于es5类实现的解释,可以更直观、更好地理解上述内容
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。