javascript - OOP javascript 存储功能如何

标签 javascript jquery oop

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

对于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的属性包括函数,没有引用它们,所以它会为它们重新分配内存,而不是共享,我错了吗?

现在回到 Klass 库,

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 所说的 parasitic inheritance 。在此模式中,方法被添加到构造函数中,并且不共享:

function Person() {
    this.walk = function() { ... }
}

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

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

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

关于javascript - OOP javascript 存储功能如何,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20407688/

相关文章:

javascript - jQuery 验证表单(检查至少 10 个字符和特定值)

C++将私有(private)纯虚拟方法覆盖为公共(public)

javascript - 下一个js : useEffect only once (if I use Link component)

javascript - 如何获取documentFragment中的子节点?

javascript - 淡入淡出冲突的 Jquery

javascript - 从选择菜单更改更新 HTTP GET 请求

javascript - 如何为日期选择器创建日期范围天间隔?

java - java中final字段初始化的问题: avoiding duplication of code using multiple constructors

javascript - 使用 TypeScript super()

javascript - 创建 jQuery 对象时出现问题