javascript-面向对象的javascript存储功能

javascript-面向对象的javascript存储功能,javascript,jquery,oop,Javascript,Jquery,Oop,我已经使用javascript Klass库一段时间了,我很好奇javascript存储是如何工作的。对于其他类OP语言中的一个公共类及其实例,如C++,类实例的方法可以由所有实例共享,所以不同实例中的所有方法只能在内存中存储一次。因此,无论我们创建了多少个类实例,我们只有一组方法并在内存中共享 对于javascript,它是否相似?我有这个问题是因为我有点担心javascript OOP的性能,如果在javascript中,我们创建了这样的类和实例- var A = { init: f

我已经使用javascript Klass库一段时间了,我很好奇javascript存储是如何工作的。对于其他类OP语言中的一个公共类及其实例,如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(我不熟悉Klass,虽然我见过类似的东西),这个问题是不可能完全回答的,但我99%确信这些函数是共享的,而不是复制的

最常见的不共享函数引用的OOP实现是Crockford调用的。在此模式中,方法添加到构造函数中,并且不共享:

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

function Superman() {
    var self = new Person();
    self.fly = function() { ... }
}
但在大多数其他情况下,无论是使用原型继承还是基于组合的继承,函数都是引用的,而不是复制或重新创建的


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

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

最常见的不共享函数引用的OOP实现是Crockford调用的。在此模式中,方法添加到构造函数中,并且不共享:

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

function Superman() {
    var self = new Person();
    self.fly = function() { ... }
}
但在大多数其他情况下,无论是使用原型继承还是基于组合的继承,函数都是引用的,而不是复制或重新创建的


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

您需要知道$.extends是如何工作的。这不是一个神奇的函数,它是一个由页面上包含的内容定义的函数。我敢打赌它只是通过引用传递函数,这意味着函数仍然只在内存中存在一次,但它在多个位置被引用。函数是通过引用保存的。为了复制,它需要一些丑陋的黑客攻击,然后失去其原始变量范围。但要进行测试,请执行
A.beep===B.beep
。你会发现它是
true
。我在手机上,所以我让你做实际的搜索:搜索“原型继承”。@blue:对,但如果你在构造函数中定义方法,每个实例都会得到它们自己的副本。@FelixKling:true。我特别指的是
$.extend
示例。当然,对创建函数的函数的两次调用将创建两个单独的函数。您需要知道$.extends是如何工作的。这不是一个神奇的函数,它是一个由页面上包含的内容定义的函数。我敢打赌它只是通过引用传递函数,这意味着函数仍然只在内存中存在一次,但它在多个位置被引用。函数是通过引用保存的。为了复制,它需要一些丑陋的黑客攻击,然后失去其原始变量范围。但要进行测试,请执行
A.beep===B.beep
。你会发现它是
true
。我在手机上,所以我让你做实际的搜索:搜索“原型继承”。@blue:对,但如果你在构造函数中定义方法,每个实例都会得到它们自己的副本。@FelixKling:true。我特别指的是
$.extend
示例。当然,对创建函数的函数的两次调用将创建两个单独的函数。你是对的。我可以理解这个like函数和object函数是一样的,所有的对象都被引用,你说的对。我可以理解这个like函数和object函数是一样的,所有的对象都被引用。