在Javascript中为类的所有实例定义公共字段的首选方法是什么?通过原型或构造函数?
function A() {
}
A.prototype.names = ['1', '2', '3']
或者
A.names = ['1', '2', '3']
我了解这两种方式需要不同的访问模式,例如this.names
和A.names
。
答案 0 :(得分:1)
对于非原始类型,您大部分时间都不想在原型中设置它们。带有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);

只有当你真的想在所有实例中共享同一个对象时,你才能获得基于原型的解决方案。但即使这样,我也会使用静态like条目并将其分配给构造函数:
A.names = ['1', '2', '3']
因为很明显它是一个共享对象,对所有人来说都是一样的。
答案 1 :(得分:0)
他们是类似的方式。 names
数组只有一个副本。
如果您需要在没有实例的情况下访问它,则应将其放在构造函数上,因为其他人可以更轻松地访问:A.names
而不是A.prototype.names
。
如果你的实例总是会访问它,那么你可以把它放在原型上,这样调用者可以参考this.names
,但我建议不要这样做,因为它不是很直观。
但它并没有什么区别,调用它只是为了方便。
话虽如此,我在JS modules这一天的个人偏好是从模块中导出一个单独的const。这样你就不需要在类本身和调用者的前面添加任何内容,如果你愿意,你可以在导入它时重命名它。如果你为私有静态变量做这些,那么你就把它们变成了私有的。
// 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 :(得分:0)
之前的答案没有错,但我想就您所谈论的内容向您提供详细的反馈。首先要记住,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
" context"!
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