gpt4 book ai didi

javascript - 我应该使用原型(prototype)吗?

转载 作者:IT王子 更新时间:2023-10-29 03:00:29 26 4
gpt4 key购买 nike

我正在创建一个 Vector 类,它基本上可以包含三个数值。然而,很多操作可以在这样的向量上完成——例如获取大小、添加或减去另一个向量等。

我想知道是否应该将这些函数编码为 Vector 类的原型(prototype)函数,或者我应该在构造函数中定义它们。

那么这两种方法哪种更可取呢?

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);
};

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);
};
}

最佳答案

这正是使用原型(prototype)的情况。我看到这样做有两个主要好处:

  1. 函数不会被多次创建。如果您在构造函数中定义函数,每次调用构造函数时,都会为您定义的每个函数创建一个新的匿名函数。原型(prototype)是静态对象,Vector3D 的每个实例都将简单地引用原型(prototype)函数。
  2. 原型(prototype)是一个易于操作的单一对象。这提供了很大的灵 active ;不幸的是,我只能提供几个例子来说明它能提供什么:
    1. 如果您想创建一个子类,例如 Vector3DSpecial,您只需克隆 Vector3D.prototype 并将其分配给 Vector3DSpecial.prototype。虽然您也可以通过 Vector3DSpecial.prototype = new Vector3D(); 使用构造函数来执行此操作,但构造函数可能包含副作用,这些副作用将在简单的原型(prototype)分配中执行,因此应该避免。使用原型(prototype),您甚至可以选择仅将原型(prototype)中的特定函数复制到新类中。
    2. Vector3D 添加方法只是向原型(prototype)添加属性的问题,并允许您的代码更轻松地拆分/组织到多个文件中,或者允许在其他部分添加方法动态代码。当然,您可以将在构造函数中添加方法和通过原型(prototype)添加方法结合起来,但这是不一致的,并且可能会导致进一步的复杂性。

我什么时候使用原型(prototype)?对于单例对象,例如与页面交互并可能将工作委托(delegate)给其他对象的 Controller 。全局“通知”对象就是这样的一个例子。在这里,扩展是不可能的,并且对象只创建一次,使原型(prototype)具有额外的(概念上的)复杂性。

关于javascript - 我应该使用原型(prototype)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4691044/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com