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

时间:2018-06-03 10:26:42

标签: javascript prototype

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

function A() {
}

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

或者

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

我了解这两种方式需要不同的访问模式,例如this.namesA.names

3 个答案:

答案 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?

您正在处理的方式是不使用构造函数。原型是contexthttps://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