gpt4 book ai didi

javascript - 定义所有公共(public)方法或原型(prototype)个人方法?

转载 作者:行者123 更新时间:2023-11-30 10:48:43 24 4
gpt4 key购买 nike

所以当我创建一个库时,我通常以这种方式进行:

var myLib = (function() {
return {
publicProperty: 'test',
publicMethod: function() {
console.log('public function');
},
anotherMethod: function() { //... },
// .. many more public methods
};
}());

我无意中听说,如果您这样写,创建库会更快并且/或使用更少的内存进行初始化:

var MyLib = function() {
this.publicProperty = 'test';
};

MyLib.prototype = {
publicMethod: function() {
console.log('public method');
},
anotherMethod: function() { //... },
// ... many more public methods
};

myLib = new MyLib();

一个初始化速度比另一个快吗?我的问题有道理吗?我假设它们完成了相同的任务(该任务是我在 docready 上的代码中的其他地方使用 myLib.publicMethod())。谢谢!

最佳答案

这两个脚本产生不同的结果。

首先,您创建具有三个(或更多)属性的对象 myLib。它的原型(prototype)是Object.prototype。重点是您制作了一个对象。

在第二个步骤中,您创建了一个名为 publicProperty 的全局变量。这可能不是您想要的。 (编辑:OP 问题已更正,这不再是问题。)

不过,假设您打算使用原型(prototype)中的方法创建一个对象,您的代码在原生 JavaScript 引擎上可能会更慢,因为调用原型(prototype)中的方法需要遍历从对象到原型(prototype)的链接。

现在,如果您的目的不是制作一个实例 myLib,那么您可以通过将方法放入原型(prototype)中来节省大量内存,因为您将拥有每个函数的一份副本。您不想要成千上万的方法副本。 :)

编辑以解决操作问题:

关于这两种方法以及如何使第一种方法“更快”:

理论上,您需要进行时空权衡。通过将方法直接放在对象中,您没有原型(prototype)链查找。但缺点是每个实例都有自己的方法副本。如果你正在创建多个实例,你应该定义每个方法一次并将它们放在一个原型(prototype)中。现代(V8 类)JavaScript 引擎非常适合处理此类内容,因此您不应该通过将方法打包到对象中来寻求优化速度。现在,对于单例,继续填充对象。另一种方法是将所有方法放在 myLib 本身中,并使用 Object.create(myLib) 创建实例。这使得 myLib 本身成为所有“实例”的原型(prototype),并且通常被认为是良好的形式(至少如果您遵循“Good Parts”建议,我通常会这样做)。

关于javascript - 定义所有公共(public)方法或原型(prototype)个人方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6798258/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com