我是一个模式的粉丝,我想我们都称之为“Crockford Classless”。该模式适用于所有浏览器和所有环境,无论可用库如何,它都允许在函数本身中定义严格模式,而无需一直重新定义它,并在对象中提供开发人员隐私。它还删除了new
关键字的要求,因为该函数创建了一个实例,无论是否使用new
。
以下是使用“Crockford Classless”和“psuedo-classical”创建的Person
“类”的基本示例,以演示这两种风格:
// Pseudo-classical
var PersonA = function (details) {
'use strict';
this.firstname = details.firstname;
this.lastname = details.lastname;
};
PersonA.prototype.getFullName = function () {
'use strict';
return this.firstname + ' ' + this.lastname;
};
// Creating an instance using Pseudo-classical
var person1 = new PersonA({firstname: 'John', lastname: 'Smith'}),
person2 = new PersonA({firstname: 'Fred', lastname: 'Bloggs'});
person1.getFullName(); // -> "John Smith"
person2.getFullName(); // -> "Fred Bloggs"
// Crockford Classless
function PersonB(details) {
'use strict';
var firstname = details.firstname,
lastname = details.lastname;
function getFullName() {
return firstname + ' ' + lastname;
}
return {
firstname: firstname,
lastname: lastname,
getFullName: getFullName
}
}
// Creating an instance using Crockford Classless
var person3 = PersonB({firstname: 'Max', lastname: 'Power'}),
person4 = new PersonB({firstname: 'Something', lastname: 'Witty'});
person3.getFullName(); // -> "Max Power"
person4.getFullName(); // -> "Something Witty"
尽管“Crockford Classless”具有优势,但这种模式几乎被普遍鄙视,主要原因是这些方法每次都被重建。经验丰富的程序员向我保证,这是浪费记忆,我很难否认他们(毕竟他们是正确的)。道格拉斯·克罗克福德(Douglas Crockford)捍卫这种模式,说现在记忆如此便宜,所有设备都有这么多,担心记忆是浪费时间(更有价值的东西)。
我的问题是:与无经典模式相比,无类模式的成本是多少?如果我创建了10,100或1000个{{1}个实例,我将会消耗多少内存?而不是PersonB
?创建的方法数量是否会显着影响结果?我在Google上看到很多结果都说是这种情况,但似乎没有人能够说出差异有多严重(或微不足道)。
答案 0 :(得分:0)
实际上这很容易计算。 JavaScript对象基本上是一个哈希表。每个条目都是ist名称及其值的元组。 所以当你使用" Crockford Classless"样式并有一个像PersonB一样的对象/类,那么你有3个条目。虽然在PersonA变体中只有两个条目。
现在假设一个真实世界的例子可能有12个函数,数据并不重要,因为它在两个变体中都是相同的。
现在虽然PersonA需要两个元组(变量)的空间,但是假设键和值需要相同的空间(它们实际上只是指针),PersonA对象需要4个指针,并且大小为#34; 4& #34 ;. (与指针大小相乘,例如4个字节或8个字节来获取实际对象大小,并添加空JavaScript对象的大小)
现在另一方面,PersonB对象都需要4个数据指针,在我的例子中有12个函数,24个指针用于那些加上编译函数本身的内存。
所以内存消耗类似于 4个单位而不是28个单位,因此 7 。
最后,它会在您的代码运行的位置及其存储方式中出现。考虑每个JSON对象可能变得更大等。考虑移动电话等。