我正在创建一个Vector类,它基本上可以包含三个数值.但是,可以在这样的矢量上完成很多操作 - 例如获取幅度,添加或减去另一个矢量等.
我想知道这些函数是否应该被编码为Vector类的原型函数,或者我应该在构造函数中定义它们.
那么这两种方法中哪一种更可取?
function Vector3D(x, y, z) {
this.x = x;
this.y = y
this.z = z;
}
Vector3D.prototype.magnitude = function() {
return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);
};
Run Code Online (Sandbox Code Playgroud)
要么
function Vector3D(x, y, z) {
this.x = x;
this.y = y;
this.z = z;
this.magnitude = function() {
return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);
};
}
Run Code Online (Sandbox Code Playgroud)
Dav*_*ang 50
这正是使用原型的情况.我认为这样做有两个主要好处:
Vector3D.prototype并将其分配给Vector3DSpecial.prototype.虽然您也可以使用构造函数来执行此操作Vector3DSpecial.prototype = new Vector3D();,但构造函数可能包含将在该简单原型分配中执行的副作用,因此应该避免.使用原型,您甚至可以只选择原型中的特定函数复制到新类.Vector3D只是向原型添加属性,并允许您的代码更容易拆分/组织成多个文件,或允许动态地在代码的其他部分添加方法.当然,你可以在构造函数和原型中组合添加方法,但这是不一致的,并且可能会导致更多的复杂性.我什么时候不使用原型?对于单例对象,例如与页面交互并可以将工作委托给其他对象的控制器.全局"通知"对象就是这样一个例子.在这里,扩展不太可能,并且对象仅创建一次,使原型成为额外的(概念上的)复杂性.
原型方法只适用于公共属性,如果你将x,y,z作为"私有"变量跟踪原型不起作用.
我会使用后者,因为你可能想要只使用私有/内部变量的方法,但这一切都取决于上下文.
function Vector3D(x, y, z) {
// x, y, z is automatically in this scope now, but as private members.
this.magnitude = function() {
return Math.sqrt(x * x + y * y + z *z);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9045 次 |
| 最近记录: |