1. 程式人生 > >閱讀《JavaScript設計模式》第二章心得

閱讀《JavaScript設計模式》第二章心得

html 思想 全局 sbo .proto PE getname left -a

面向對象編程

面向對象編程就是將你的需求抽象成一個對象。然後針對這個對象分析其特征(屬性)與動作(方法)。這個對象我們稱之為類。面向對象編程思想其中的一個特點就是封裝。

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設計模式》第二章心得