在 JavaScript 中,您可以通过多种不同的方式完成同一件事。
考虑以下示例:
1:
function Circle(radius) {
return {
"r" : radius,
"area" : function(){
return Circle.pi * this.r * this.r;
}
}
}
Circle.pi = 3.14159;
var a = Circle(10);
alert(a.area());
2:
function Circle(radius) {
this.r = radius;
}
Circle.pi = 3.14159;
Circle.prototype.area = function(){
return Circle.pi * this.r * this.r;
}
var a = new Circle(10);
alert(a.area());
第二个比第一个更好,因为我们没有定义相同的函数area对于任何一个实例Circle.
但让我们考虑一下
3:
function Circle(radius) {
return {
"r" : radius,
"area" : Circle.area
}
}
Circle.pi = 3.14159;
Circle.area = function(){
return Circle.pi * this.r * this.r;
}
var a = Circle(10);
alert(a.area());
有什么理由选择第二种而不是第三种?或者我根本误解了什么?
我肯定会选择示例 2。示例 1 或示例 3 都没有充分利用 JavaScript 的面向对象功能,因为:
- 您在每个实例中复制方法定义。
- 通过返回一个新对象而不是使用
this
,你失去了班级的身份,即你不能再进行像这样的检查a instanceof Circle
.
- 因为您不使用原型,所以您放弃了继承的可能性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)