閱讀《JavaScript設計模式》第二章心得
面向對象編程
面向對象編程就是將你的需求抽象成一個對象。然後針對這個對象分析其特征(屬性)與動作(方法)。這個對象我們稱之為類。面向對象編程思想其中的一個特點就是封裝。
1、私有屬性、私有方法、特權方法、對象公有屬性、對象公有方法、構造器和類靜態公有屬性、類靜態公有方法、公有屬性、公有方法
var Book = function (id,name,price){
//私有屬性
var num = 1;
//私有方法
function checkId(){};
//特權方法
this.getName = function(){};
this.getPrice = function(){};
this.setName = function(){};
this.setPrice = function(){};
//對象公有屬性
this.id=id;
//對象公有方法
this.copy=function(){};
//構造器
this.setName(name);
this.setPrice(price);
};
//類靜態公有屬性(對象不能訪問)
Book.isChinese = true;
//類靜態公有方法(對象不能訪問)
Book.resetTime = function(){
console.log(‘new Tiem‘)
};
Book.prototype = {
//公有屬性
isJSBook : false;
display : function(){}
}
測試代碼如下
var b = new Book(11,22,33);
console.log(b.num); //undefined
console.log(b.isJSBook); //false
console.log(b.id); //11
console.log(b.isChinese); //undefined
console.log(Book.isChinese); //true
Book.resetTime(); //new Tiem
2、閉包實現
閉包是有權訪問另一個函數作用域中變量的函數,即在一個函數中創建另一個函數。
new關鍵字的作用可以看作是對當前對象的this不停的賦值。如果實例化的時候不寫new就相當於在全局作用域中執行了實例化函數,那麽實例化就會出現問題
由於小程序中沒有window對象,所以在全局實例化不帶new時候就會報錯,但是網頁中就不會報錯。
解決忘記寫new的方法是使用安全模式,代碼如下:
var Book = function (title, time, type){
//判斷執行過程中this是否是當前這個對象(如果是說明是用new創建的)
if(this instanceof Book){
this.title = title;
this.time = time;
this.type = type;
}else{
return new Book(title,time,type);
}
}
3、繼承
new之後的變量是沒有prototype的 ,只有__proto__屬性,也就是實例化之後就沒有prototype原型了,但是prototype是等於實例化之後的__proto__的。實例化之後的變量的__proto__中的constructor是等於實例化之前的構造函數的。
但是在打印實例化之後的構造函數時可以這樣:
console.log(a.__proto__.constructor)
也可以這樣
console.log(a.constructor)
打印出來的都是實例化之前的構造函數,因為如果查找一個屬性在變量中找不到就會去變量的隱藏屬性__proto__中去找。
JavaScript中除了數字、字符串、布爾值、null和undefined之外的就是對象了,所以數組是對象,對象之間相互賦值只是更換的內存地址,內存地址所指向的值都是一樣的,是會相互影響的。
詳情請戳這 JavaScript中值類型和引用類型的區別
下面放寄生組合式繼承實例:
1 function inheritObject(o){ 2 function F(){} 3 F.prototype = o; 4 return new F(); 5 } 6 7 function inheritPrototype(subClass,superClass){ 8 var p = inheritObject(superClass.prototype); 9 console.log(p) 10 console.log(superClass) 11 p.constructor = subClass; 12 subClass.prototype = p 13 } 14 15 function SuperClass(name){ 16 this.name = name; 17 this.colors = ["red","blue","green"]; 18 } 19 SuperClass.prototype.getName = function(){ 20 console.log(this.name) 21 } 22 function SubClass(name,time){ 23 SuperClass.call(this,name) 24 this.time = time; 25 } 26 27 28 inheritPrototype(SubClass,SuperClass); 29 SubClass.prototype.getTime = function(){ 30 console.log(this.time) 31 } 32 var instance1 = new SubClass("js book",2014) 33 var instance2 = new SubClass("css book",2013) 34 35 instance1.colors.push("black") 36 console.log(instance1.colors) 37 console.log(instance2.colors) 38 instance2.getName(); 39 instance2.getTime();
4、多繼承
關於js中的for in和in用法
閱讀《JavaScript設計模式》第二章心得