在JavaScript中,我们有两种创建“类”并为其提供公共功能的方法。
方法1:
function MyClass() {
var privateInstanceVariable = 'foo';
this.myFunc = function() { alert(privateInstanceVariable ); }
}
方法2:
function MyClass() { }
MyClass.prototype.myFunc = function() {
alert("I can't use private instance variables. :(");
}
我读过无数次的人说使用方法2效率更高,因为所有实例共享该函数的相同副本,而不是每个实例都有自己的副本。尽管通过原型定义函数有一个很大的缺点-
它使得不可能拥有私有实例变量。
即使从理论上讲,使用方法1会为对象的每个实例提供其自己的函数副本(从而使用更多的内存,更不用说分配所需的时间了)-那实际上是在发生什么吗?似乎Web浏览器可以很容易地进行优化,以识别这种极为常见的模式,并实际上使对象的所有实例引用通过这些“构造函数”定义的函数的同一副本。然后,如果稍后对其进行显式更改,则只能为实例提供其自己的函数副本。
关于两者之间的性能差异的任何见解-甚至更好的 现实经验 -都将非常有帮助。
通过原型声明方法更快,但是是否相关尚有待商.。
如果您的应用程序中存在性能瓶颈,则不太可能是这种情况,除非您碰巧在任意动画的每一步上实例化10000个以上的对象。
如果性能是一个严重的问题,并且您想进行微优化,那么我建议您通过原型进行声明。否则,请使用最适合您的模式。
我要补充一点,在JavaScript中,有一个前缀属性约定,该属性应被视为带有下划线的私有属性(例如_process()
)。除非他们愿意放弃社会契约,否则大多数开发人员都会理解并避免使用这些属性,但是在这种情况下,您最好也不要照顾他们。我的意思是:您可能真的不需要
真正的私有变量…
问题内容: 我想知道使用这些方法相对于其他方法是否有任何优势,我应该走哪条路? 构造方法: 原型方法: 我不喜欢这样,使用原型将方法定义与类分开,并且我不知道是否有任何特殊原因我应该仅在第一种方法上使用它。 此外,与仅使用函数定义相比,使用函数文字来定义“类”有什么好处: 与 谢谢! 问题答案: 通过原型链继承的方法可以针对所有实例进行通用更改,例如: 请注意如何更改应用于两个实例的方法?这是因为
我有一个用于父级的构造函数: 稍后,我使用关键字创建一个对象: 我正在尝试使用defineProperty添加属性 但是,当我试图访问时,它返回。同样,当我在控制台中打印整个对象时,该属性仍然保持。 我错在哪了?
我想做一个简单的POJO(POKO?)在Kotlin中使用一个默认的空构造函数和一个带有参数的辅助构造函数创建一个类,该类提供属性 这并没有给我和属性: 这为我提供了属性,但它们在实例化后没有设置: 这给了我一个编译错误,说“不允许在二级构造函数参数上使用'var'”: 那么,这是怎么做到的?我如何拥有一个默认构造函数和一个带有参数和属性的二级构造函数?
问题内容: 根据这份 babel文档,将ES6 +与React结合使用的正确方法是对初始组件进行如下处理: 但是一些官方示例,例如Dan Abramov自己的React DnD模块,使用ES6 +,但仍在构造函数中定义状态: 现在,作为React的重要贡献者的Dan Abramov可能知道他可以在构造函数之外定义状态,但仍然选择在构造函数内完成状态。 所以我只是想知道哪种方法更好,为什么呢? 问题
问题内容: 如果我有一个像这样的构造函数: 然后,我如何在与构造函数相同的类中的方法中使用变量c和d,因为尝试仅在方法中使用变量名似乎不起作用? 问题答案: 实际上,您的代码将无法编译- 无效。 我认为您的意思是:- 。 然后我如何在与构造函数相同的类中的方法中使用变量c和d 您不能这样做,因为您已将它们声明为局部变量,其范围在构造函数结束执行时终止。 您应该将它们声明为实例变量。
我很难确定这到底是什么。此时,我已经熟悉了方法、构造函数和类声明的样子。这是哪个?为什么它看起来像一个构造函数和一个方法有一个婴儿?