我一直在阅读有关在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' });
我对一些事感到困惑.
我以前从未见过以这种方式使用的对象文字.
>他没有指定键值对,而只是逗号分隔字符串.
>他在任务的左边使用它们
另外,冻结他返回的物体有什么好处?
解决方法
他没有指定键值对,而只是逗号分隔他正在利用
ES6 feature that converts the variable names of the values into string object keys for you的字符串.
{ bark,breed }
相当于:
{ bark: bark,breed: breed }
冻结对象的优点是不变性.对象冻结后,其属性无法更改.
这很好,因为它有助于避免一些常见错误,例如由于拼写错误而尝试更改不存在的属性,并阻止您(和其他编码人员)在创建对象后重新定义或添加方法和属性.
编辑:
这里演示的另一个ES6功能是destructuring.
var { name,breed } = spec;
相当于:
var name = spec.name,breed = spec.breed;