什麼是鴨子類型javascript
javascript的面向對象java
封裝編程
繼承設計模式
多態閉包
原型app
this指向函數
callthis
applyprototype
band設計
js中的閉包
什麼是高階函數
在寫面向對象編程思想-設計模式中的js部分的時候發現不少基礎知識不瞭解的話,是很難真正理解和讀懂js面向對象的代碼。爲此,在這裏先快速補上。而後繼續咱們的面向對象編程思想-設計模式。
什麼是鴨子類型
javascript是一門典型的動態類型語言,也就弱類型語言。
那什麼是鴨子類型:【若是它走起路來像鴨子,叫起來也是鴨子,那麼它就是鴨子】
var 鴨子 = {
走路: function () { },
咕咕咕: function () { }
}
var 鸚鵡 = {
走路: function () { },
咕咕咕: function () { }
}
這隻鸚鵡一樣有「走路」和「咕咕咕」的方法,那在js的世界裏就能夠把它當成鴨子。
能夠這樣調用:
var 鴨子們 = [];
鴨子們.push(鴨子);
鴨子們.push(鸚鵡);
for (var i = 0; i < 鴨子們.length; i++) {
鴨子們[i].走路();
}
因此js的世界沒有抽象和接口,但能夠約定「咱們都是鴨子」。
javascript的面向對象
javascript不只是直譯式腳本語言、動態類型、弱類型語言、函數爲一等公民的語言,它仍是基於原型的面嚮對象語言。面向對象三大特性:封裝、繼承、多態,下面咱們用js分別實現。
封裝
var Person = (function () {
var sex = "純爺們";
return {
name: "農碼一輩子",
getInfo: function () {
console.log("name:" + this.name + ",sex:" + sex);
}
};
})();
雖然老的js語法沒有提供private等關鍵字,可是咱們能夠利用閉包來實現私有字段,達到封裝的目的。
繼承
字面量表示:
var Person = {
name: "農碼一輩子",
getName: function () {
console.log(this.name);
}
};
var obj = Person;
obj.getName();
函數構造器:
var Person = function () {
this.name = "農碼一輩子";
}
Person.prototype.getName = function () {
console.log(this.name);
}
var obj = function () { };
obj.prototype = new Person();//obj繼承於Person
var o = new obj();
o.getName();//直接調用原型中的getName(相似於C#中的調用父類方法)
多態
對於多態,其實上面的鴨子類型已經表現的很清楚了。
var 鴨子們 = [];
鴨子們.push(鴨子);
鴨子們.push(鸚鵡);
for (var i = 0; i < 鴨子們.length; i++) {
鴨子們[i].走路();//對於鸚鵡來講,它多是跳着走。對於鴨子來講,它可能左右搖擺着走。這就是多態的表現。
}
對於鸚鵡來講,它多是跳着走。對於鴨子來講,它可能左右搖擺着走。這就是多態的表現。