JavaScript設計模式閱讀
更多文章檢視本專欄
第二章:類
1、閉包實現類
閉包可以理解為`類生成器`
閉包程式碼:
var Book = (function(){
var bookNum = 0;
function checkBook(name){
}
return function(newId,newName,newPrice){
var name,price;
this.id = newId;
bookNum++;
if(bookNum > 100){
throw new Error(`最多隻出版100本書`);
}
function checkID(id){}
this.getName = function(){
console.log(name);
return name;
};
this.getPrice = function(){
console.log(price);
return price;
};
this.setName = function (mName) {
name = mName;
};
this.setPrice = function (mPrice) {
price = mPrice;
};
this.copy = function () {};
// 構造器
this.setName(newName);
this.setPrice(newPrice);
}
})();
Book.prototype = {
isJSBook: false,
display: function () {
}
}
使用:
var myBook = new Book(`id`,`name`,`price`);
使用方法與普通的是一致的。
但是如果不加new關鍵詞的話
var myBook = Book(`id`,`name`,`price`);
當不使用new關鍵詞的時候只會將Book執行一遍並且this指標為window
並且所有的值都在
可以使用將return的function寫為一個私有的類,並且將外部的prototype寫在裡面,讓閉包看起來更加的舒服,更像是一個整體。
2、物件的安全模式
在使用類的時候可能會忘記使用new關鍵詞。這個時候呼叫就像上面說的那種。執行一遍程式碼,並且其中的this指向window。
可以使用安全模式避免忘記使用new的情況。
列子:
var Book = function (title,time,type) {
if(this instanceof Book){
this.title = title;
this.time = time;
this.type = type;
}else{
return new Book(title,time,type);
}
}
本質可以看出就是加了一層判斷。
3、js原型鏈對引用型別的無力。
當原型鏈上的值為引用的時候:
var test = function () {
}
test.prototype.nums = [1,2,3,4];
ins1 = new test();
ins2 = new test();
console.log(ins2.nums);
ins1.nums.push(5);
console.log(ins2.nums);
這裡就可以看出來如果原型鏈上的值為引用型別的時候會出現問題。
4、多繼承
多繼承的實現就是將父類們的所有屬性進行拷貝到一個到當前類上。
當遇到引用型別的時候應當深拷貝,但是此處我們只討論淺拷貝的問題。
以下程式碼為多繼承:
var mix = function () {
var len = arguments.length;
var target = arguments[1];
var arg;
for(var i = 1;i < len;i++){
arg = arguments[i];
for(var property in arg){
target[property] = arg[property];
}
}
return arg;
}
5、多型
多型是對arguments裡面的值得個數進行統計,根據不同的情況給予不同的回應。
簡單例子
var add = function () {
var len = arguments.length;
switch (len) {
case 0:
return 10;
case 1:
return 10 + arguments[0];
case 2:
return arguments[0] + arguments[1];
}
}