javascript存储函数的OOP方式
OOP how javascript store functions
我使用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())
的操作,这是可能的,但很少使用。
相关文章:
- 为什么这在IE中的工作方式与在Firefox中不同
- 在AngularJS应用程序中使用封装指令和路由的推荐方式是什么
- Windows8应用程序(html&Javascript):从图片库(除了文件选择器)显示图像的另一种方式
- 在localhost Dev Box上测试JSONP请求的最佳方式
- 使用javascript存储变量的最安全方式
- 以可优化的方式使用requirejs加载模板
- 在Highcharts中,我们可以通过任何方式在渲染图表之前获得plotWidth和plotHeight
- 任何方式使AJAX调用Gmail API,而无需通过JS库
- 为react组件传递道具的最佳方式
- 让Webpack管理Quirky AMD定义的最佳方式
- 在承诺链中处理早期回报的最佳方式
- 如何“;过滤器”;或者以其他方式重构该数据
- 您有更好的动态方式来缩短复杂的代码jquery吗
- 在ng重复循环中显示条件内容的最佳方式是什么
- 在phonegap中为android调用onload函数的最佳方式
- 如何创建更好的方式来维护基于我的代码访问的最后一个页面
- Javascript以不同的方式声明数字
- 链接两个网页或网络应用程序的最佳方式
- javascript存储函数的OOP方式
- 我怎么能用正确的oop方式编写这个jquery代码呢