冬至来了,刚去吃了一碗萝卜饺子,浑身发热。突然觉得鸭子已经熟了。
开个玩笑。这里要说的是动态语言的鸭子类型(ducking type)。 这个话题应该是整个javascript面向对象编程的核心思想
.不知道下这个结论对不对?可是在前面还不太了解到底是什么意思。看代码的时候总有种感觉,就是javascript太灵活了,怎么什么对象的方法都可以直接通过参数传递的方式来在另一个函数中使用。在模式学习时常看到这种代码。
刚才又重新看这部分内容时突然明白了。这个方法就是面向对象编程里的鸭子模型。
什么是鸭子类型呢?我总结一句话,英雄不问出处,只要能干活就行。javascript里面对象都是蓝领,只干活,至于是小学水平还是博士水平,我们不关心,能干活就行。 java语言就不是,java在你干活之前想要把你的祖宗十八代都查一遍,根正苗红的才能来干活。所以javascript就很灵活啦。
这就是鸭子类型。如果它走起路来像鸭子,叫起来嘎嘎的,那么它就是鸭子
。
鸭子类型赋予了javascript极大的灵活性,动态调用对象方法的时候非常自由。
参考《javascript模式设计与开发实践》 第一章
看下面代码
var duck = { //鸭子对象
duckSinging: function(){
console.log( '嘎嘎嘎' );
}
};
var chicken = { //鸡对象
duckSinging: function(){
console.log( '嘎嘎嘎' );
}
};
var choir = []; // 合唱团
var joinChoir = function( animal ){ //实例化动物对象
if ( animal && typeof animal.duckSinging === 'function' ){
//稍作检测,只要有唱歌的方法就可以用。
choir.push( animal );
console.log( '恭喜加入合唱团' );
console.log( '合唱团已有成员数量:' + choir.length );
}
};
joinChoir( duck ); // 恭喜加入合唱团
joinChoir( chicken ); // 恭喜加入合唱团
以上就是一个鸭子类型的代码, 鸡也混入合唱团了,但是没有关系,英雄不问出处,只要你能唱歌就行了。
很方便对象方法的调用。 javascript代码中遍布这样的例子,但是现在看来一点也不奇怪了。因为这鸭子类型就是动态语言的优势。而javascript就是动态语言之一,只是实现了这种模式而已。
对于这个问题的认识也破费周折,但是现在看来是值得的。理解了这一点,对javascript的应用能力就更加深了一步。
网友评论
例子来源于《javascript设计模式与开发实践》,第一章,如果有理解上的错误可以参考原书。的确是对象数组,但是这也是其他语言所没有的。上面代码基本出现在每个javascript的模式里。