我一直在阅读有关在JS中执行OOP的不同方法。
道格拉斯·克罗克福德(Douglas Crockford)有一种有趣的方法,他根本不会使用代表团。相反,对我而言,他似乎纯粹利用对象连接作为他的继承机制,但我很难说出最新情况,我希望有人可以提供帮助。以下是克罗克福德在其中一次会谈中提出的一个例子。
function constructor(spec) {
let {member} = spec,
{other} = other_constructor(spec),
method = function () {
// accesses member, other, method, spec
};
return Object.freeze({
method,
other
});
}
以下是a gist
的示例function dog(spec) {
var { name, breed } = spec,
{ say } = talker({ name }),
bark = function () {
if ( breed === 'chiuaua' ) {
say( 'Yiff!' );
} else if ( breed === 'labrador' ) {
say('Rwoooooffff!');
}
};
return Object.freeze({
bark,
breed
});
}
function talker(spec) {
var { name } = spec;
var say = function(sound) {
console.log(name, "said:", sound)
}
return Object.freeze({
say
});
}
var buttercup = dog({ name: 'Buttercup', breed: 'chiuaua' });
我对一些事情感到困惑。
我以前从未见过以这种方式使用的对象文字。
此外,冻结他返回的物体有什么好处?
答案 0 :(得分:7)
他没有指定键值对,而只是逗号分隔他正在利用ES6 feature that converts the variable names of the values into string object keys for you的字符串。
{ bark, breed }
相当于:
{ bark: bark, breed: breed }
冻结对象的优点是不变性。一旦对象被冻结,它的属性就无法改变。
这很好,因为它有助于避免一些常见错误,例如由于拼写错误而尝试更改不存在的属性,并阻止您(和其他编码人员)在创建对象后重新定义或添加方法和属性。< / p>
编辑: 此处演示的另一个ES6功能是destructuring。
var { name, breed } = spec;
相当于:
var name = spec.name,
breed = spec.breed;