javascript存储函数的OOP方式

OOP how javascript store functions

本文关键字:OOP 方式 函数 存储 javascript      更新时间:2024-03-19

我使用javascript Klass库已经有一段时间了,我对javascript存储的功能很好奇。对于其他OOP语言(如C++)中的公共类及其实例,类实例的方法可以由所有实例共享,因此不同实例中的所有方法只能在内存中存储一次。因此,无论我们创建了多个类实例,我们都只有一组方法并在内存中共享。

对于javascript,它类似吗?我有这个问题是因为我有点担心javascript OOP的性能,如果在javascript中,我们创建了这样的类和实例-

var A = {
    init: function () {
    },
    say: function (words) {
        console.log (words);
    }
};
var B = $.extends (A, {
    beep: function () {
        console.log (words);
    }
}); 

我认为B实际上复制了A的属性,包括函数,而不是引用它们,所以它会为它们重新分配内存,而不是共享,我错了吗?

现在回到克劳斯图书馆,

var Person = klass(function (name) {
  this.name = name
})
  .statics({
    head: ':)',
    feet: '_|_'
  })
  .methods({
    walk: function () {}
  });
var SuperHuman = Person.extend(function (name) {
  // super class is automagically called
})
  .methods({
    walk: function() {
      this.supr()
      this.fly()
    },
    fly: function() {}
  })
new SuperHuman('Zelda').walk();

在子类和所有实例中,它们是引用了这些函数还是复制了这些函数?

如果不深入了解Klass(我不熟悉,尽管我见过类似的),这个问题是不可能完全回答的,但我99%确信这些函数是共享的,而不是复制的。

最常见的OOP实现是Crockford所说的寄生继承,它不共享函数引用。在这种模式中,方法被添加到构造函数中,并且不共享:

function Person() {
    this.walk = function() { ... }
}
function Superman() {
    var self = new Person();
    self.fly = function() { ... }
}

但在大多数其他情况下,无论是使用原型继承还是基于组合的继承,函数都是被引用的,而不是被复制或重新创建的。

作为一个实践点,很难不通过引用共享函数,除非这些函数是在某种构造函数或工厂函数中声明的。为了复制您列出的结构中的函数,您必须执行类似eval(fn.toString())的操作,这是可能的,但很少使用。