我使用 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/