Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.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 Class.prototype.affunction()与Class.affunction()的比较_Javascript_Prototype - Fatal编程技术网

Javascript Class.prototype.affunction()与Class.affunction()的比较

Javascript Class.prototype.affunction()与Class.affunction()的比较,javascript,prototype,Javascript,Prototype,在示例代码中: var Class = function() { } Class.prototype.nonStaticFunction = function() { } Class.staticFunction = function() { } 静态功能是否比非静态功能具有速度、内存或任何其他重要特征 我相信staticFunction有以下特点,但我肯定我遗漏了一些,我想知道什么时候使用它们 此关键字将是类函数,而不是对象 无需实例化类对象即可使用 它们有完全不同的用例 Cla

在示例代码中:

var Class = function() {

}

Class.prototype.nonStaticFunction = function() {

}

Class.staticFunction = function() {

}
静态功能
是否比
非静态功能
具有速度、内存或任何其他重要特征

我相信
staticFunction
有以下特点,但我肯定我遗漏了一些,我想知道什么时候使用它们

  • 关键字将是
    函数,而不是对象
  • 无需实例化
    对象即可使用

它们有完全不同的用例

Class.staticFunction; // function () {...}, `this` defaults to `Class`
Class.nonStaticFunction; // undefined
因此,如果我们想使用
Class
作为名称空间,您应该选择称为“staticFunction”的样式

因此,如果我们想使用
Class
作为构造函数,您应该选择称为“非静态函数”的样式

  • 在这两种情况下,都没有在定义时间之后创建staticFunction或nonStaticFunction的新实例,因此内存使用情况是相同的
  • 对象查找是通过本机代码中的哈希表完成的,无论在原型链中的何处找到密钥,都会有明显的不同
  • 创建实例比不创建实例要昂贵,但是如果您无论如何都需要创建一些东西,那么所花费的时间就不会有任何收益或损失

JavaScript并没有真正的类,这些类是来自经典语言的结构,但JavaScript是一种原型语言

JavaScript中只有对象,这些对象可以通过两种不同的方式链接在一起

  • 按属性(你可能已经习惯了),例如

  • 通过原型链,例如

    baz = {fizz: 'buzz'};
    bar = Object.create(baz);
    foo = Object.create(bar);
    foo.fizz; // "buzz" via
    // no own _fizz_ on `foo`
    // no own _fizz_ on `bar`    ( = Object.getPrototypeOf(foo) )
    // own _fizz_ found on `baz` ( = Object.getPrototypeOf(bar) )
    
在ES5中,使用原型直接定义构造器是一种语法上的优势



Java和JavaScript是完全不同的语言,不要因为它们的名称而认为它们是相似的。

我明白了,我想我应该进一步完善我的问题。在Java中,人们倾向于使用静态方法来减少内存占用等。javascript中的这个
静态函数
是否有这样的优势?我们完全同意Java到js就像面包到网球鞋一样,没有关系。“创建实例比不创建实例要昂贵,但如果你无论如何都需要创建一些东西,那么在时间上就不会有任何收获或损失。”这与我所寻找的更为接近。一个是在对象的给定实例上调用的实例方法
obj.method()
,另一个是静态方法,它只是作为普通的命名空间函数调用
Class.func()
foo = {};
foo.bar = {};
foo.bar.baz = {fizz: 'buzz'};
foo.bar.baz.fizz; // "buzz"
baz = {fizz: 'buzz'};
bar = Object.create(baz);
foo = Object.create(bar);
foo.fizz; // "buzz" via
// no own _fizz_ on `foo`
// no own _fizz_ on `bar`    ( = Object.getPrototypeOf(foo) )
// own _fizz_ found on `baz` ( = Object.getPrototypeOf(bar) )