代码之家  ›  专栏  ›  技术社区  ›  Wickoo

在javascript中定义公共字段的首选方法:在prototype或constructor上?[关闭]

  •  0
  • Wickoo  · 技术社区  · 7 年前

    在javascript中,为类的所有实例定义公共字段的首选方法是什么?通过原型还是构造器?

    function A() {
    }
    
    A.prototype.names = ['1', '2', '3']
    

    A.names = ['1', '2', '3']
    

    我知道这两种方式需要不同的访问模式,例如, this.names A.names ,分别是。

    3 回复  |  直到 7 年前
        1
  •  0
  •   Ruan Mendes    7 年前

    它们是相似的方式。只有一份 names 数组。

    如果需要在没有实例的情况下对其进行访问,则应将其放在构造函数上,因为其他人更容易访问: A.names 而不是 A.prototype.names .

    如果您有一个实例将始终访问它的案例,那么您可以将它放在原型上,以便调用方可以引用 this.names ,但我建议反对,因为这不是很直观。

    但没什么区别,只是打电话的时候方便。

    既然如此,我个人在这一天的偏好 JS modules 只是从模块中导出一个单独的常量。这样,您就不需要在它前面加上类本身和调用方的任何前缀,如果您愿意,可以在导入时重命名它。如果对私有静态变量执行此操作,则会使它们真正私有。

    // A.js
    export class A () {}
    export const names = ["", "a"];
    // main.js
    import A, names as ANames from "a";
    console.log("look ma, no prefix for static fields", ANames);
    
        2
  •  1
  •   t.niese    7 年前

    对于非基元类型,大多数情况下不希望在原型中设置它们。这个 “问题” prototype 基本版本,即所有实例将共享同一对象。

    function A() {
    }
    
    A.prototype.names = ['1', '2', '3']
    
    var a1 = new A()
    var a2 = new A()
    
    a1.names.push(4);
    
    console.log(a1.names);
    console.log(a2.names);

    只有当您真的想在所有实例中共享同一个对象时,您才需要基于原型的解决方案。但即便如此,我还是会使用类似静态的条目并将其分配给构造函数:

    A.names = ['1', '2', '3']
    

    因为很明显这是一个共享对象,对所有人来说都是一样的。

        3
  •  0
  •   Allan Felipe Murara    7 年前

    之前的回答没有错,但我想给你一个详细的反馈,告诉你你在说什么。首先要记住,js中的一切都是对象。(与函数、类相关, How is almost everything in Javascript an object? )

    你处理的方法,不是使用构造函数。原型是 context ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this )记住,构造函数是对象(函数)创建的一部分,它们基本上是函数本身,所以您将使用 function A() { this.names = [1,2,3,4] } 和简单实例new a();

    如果你真的认为你需要把它挂在构造器中,看看- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor

    跟着这个,你就会找到正确答案。

    既然我们知道“上下文”对一个对象意味着什么,让我们来讨论一下你能和我们的新朋友做些什么, prototype “上下文”!

    function names(names) {
      this.names = names;
      return this.names;
    }
    const assigned1 = new names('allan');
    console.log('first assign', assigned1);
    
    names.prototype.reassign = function() { this.names = [ ...arguments ]};
    
    assigned1.reassign('allan', 'joao', 'maria');
    
    console.log('reasigned', assigned1);

    也就是说,如果你真的需要在你的对象中有一个.names(这对js来说并不常见),那么使用构造函数。否则你将采取一种不建议的方法。但是当你想深入一点的时候,在js中尝试geters和seters的概念:)它们更符合你的需要,你还需要避免在函数中直接设置对象,这不是一个好的方法=)尝试创建一个新的json对象。

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/set