Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript中定义公共字段的首选方法:原型还是构造函数?_Javascript_Prototype - Fatal编程技术网

JavaScript中定义公共字段的首选方法:原型还是构造函数?

JavaScript中定义公共字段的首选方法:原型还是构造函数?,javascript,prototype,Javascript,Prototype,在Javascript中为类的所有实例定义公共字段的首选方法是什么?通过原型还是构造器 function A() { } A.prototype.names = ['1', '2', '3'] 或 我知道这两种方式需要不同的访问模式,例如,this.names和A.names。对于非原语类型,大多数情况下您不希望在原型中设置它们。prototypebase版本的“问题”是所有实例都将共享同一个对象 函数A(){ } A.prototype.names=['1','2','3'] var a

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

function A() {
}

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


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

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

函数A(){
}
A.prototype.names=['1','2','3']
var a1=新的A()
var a2=新的A()
a1.名称。推送(4);
控制台日志(a1.名称);

控制台日志(a2.名称)它们是相似的方式。只有一个
名称
数组的副本

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

如果实例总是可以访问它,那么您可以将其放在原型上,以便调用方可以参考
this.names
,但我建议不要这样做,因为这不是很直观

但这没什么区别,只是打电话的方便性问题

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

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

以前的答案没有错,但我想给你一个关于你所说内容的详细反馈。首先要记住,JS中的一切都是对象。(函数、相关类)

您处理的方式不是使用构造函数。原型是一个
上下文
()。记住,构造函数是对象(函数)创建的一部分,它们基本上就是函数本身,所以要使用
function A(){
this.names=[1,2,3,4]
}
和简单实例new A()

如果您真的认为需要将其挂接到构造函数中,请查看-

遵循这一点,你就会找到接近正确答案的答案

现在我们知道了“上下文”对对象的意义,让我们来讨论一下你可以和我们的新朋友,
prototype
“上下文”做什么

函数名(名称){
this.names=名称;
返回此名称;
}
const assigned1=新名称('allan');
console.log('first assign',assigned1);
names.prototype.reassign=function(){this.names=[…arguments]};
分配1.重新分配('allan'、'joao'、'maria');

console.log('reasigned',assigned1)
收回了我的upvote,因为OP要求向构造函数添加属性,就像在静态字段中一样。然而,这里有一个帖子的脏插件,它解释了您所指的@t.niese我明白您的意思,但是使用构造函数,也只有一个数组实例,您可以修改它。是因为访问是静态的,而且更明确吗?这就是我在回答中所说的,我宁愿参考
A.names
,而不是
A.prototype.names
,如果我手头没有它的实例,你似乎理解这个问题。没有正确的答案,只有不同的选项和首选项,这意味着这不适合StackOverflow。我有一种强烈的感觉,即实际上有一个正确的答案,只要javascript是约定而不是配置语言。所以,惯例决定了什么是最好的,以及如何以更好的方式做到这一点。
// 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);