Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.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_Initialization_Libraries_Prototype Programming_Public Method - Fatal编程技术网

Javascript 定义所有公共方法还是原型单个方法?

Javascript 定义所有公共方法还是原型单个方法?,javascript,initialization,libraries,prototype-programming,public-method,Javascript,Initialization,Libraries,Prototype Programming,Public Method,因此,当我创建一个库时,我通常是这样做的: var myLib = (function() { return { publicProperty: 'test', publicMethod: function() { console.log('public function'); }, anotherMethod: function() { //... }, // .. many mor

因此,当我创建一个库时,我通常是这样做的:

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
。它的原型是
Object.prototype
。关键是你做了一件事

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

尽管如此,假设您打算使用原型中的方法创建一个对象,您的代码在朴素的JavaScript引擎上可能会慢一些,因为在原型中调用方法需要遍历从对象到原型的链接

现在,如果您的目的不是制作一个而是制作多个
myLib
实例,那么将方法放入原型中可以节省大量内存,因为每个函数都有一个副本。您不需要数以千计的方法副本。:)

编辑以解决问题:

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


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

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

在第一个示例中,创建具有三个(或更多)属性的对象
myLib
。它的原型是
Object.prototype
。关键是你做了一件事

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

尽管如此,假设您打算使用原型中的方法创建一个对象,您的代码在朴素的JavaScript引擎上可能会慢一些,因为在原型中调用方法需要遍历从对象到原型的链接

现在,如果您的目的不是制作一个而是制作多个
myLib
实例,那么将方法放入原型中可以节省大量内存,因为每个函数都有一个副本。您不需要数以千计的方法副本。:)

编辑以解决问题:

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


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

编辑:查看问题的变化,我问您:

  • 您是否计划同时拥有库的多个“实例”
如果您不这样做,我看不到使用构造函数的任何好处,您将只有一个对象,没有必要在其原型上定义属性-它们将被定义并在单个对象上使用-

如果您想拥有多个对象实例,那么使用继承将非常有用,这些方法将被共享、重用,并且在原型链中只声明一次


第二个示例中有几个问题:

var myLib = (function() {
   this.publicProperty = 'this';
}());
myLib
变量将只包含
undefined
——您不会从函数表达式返回任何内容,
publicProperty
将被定义为全局对象的属性,因为在执行此函数的方式中,
将绑定到全局对象

另外,如果代码是在中执行的,
这个
值在这种情况下将是
未定义的
,并且您的属性访问表达式将抛出一个
类型错误
——这在我看来是一件好事,因为我很确定您不想将
publicProperty
声明为全局对象的成员

myLib.prototype = {
    publicMethod: function() {
        console.log('public method');
    },
    anotherMethod: function() { //... },
    // ... many more public methods
};
在此处访问
prototype
属性将失败-请记住,
myLib
未定义的

prototype
仅对函数有意义,用于构造函数函数-打算与
new
运算符一起使用的函数-我认为您将该属性与inter