1. 程式人生 > >談談對js面向物件的理解

談談對js面向物件的理解

1、建構函式的優缺點:

  建構函式就是一種封裝,把一些物件的屬性封裝在函式體裡面,這種函式體在載入的時候,會被預編譯,

var cat1 = new Cat("大毛","黃色"); //例項化

例項化其實就是把建構函式變成一個物件,但是如果多個新建物件被例項化的時候,其實等於建構函式不斷被複制佔大量的記憶體,故對一些需要不對被例項化的建構函式,不適合放太多屬性在裡面。這個時候就需要用到原型(prototype)

Javascript規定,每一個建構函式都有一個prototype屬性,指向另一個物件。這個物件的所有屬性和方法,都會被建構函式的例項繼承。

所以原型的優點非常明顯,我們只需要把一些不便的屬性和方法放在原型裡面,它就可以指向同一個記憶體地址,提高執行速度。

2.物件的繼承

   物件繼承分兩種情況,一種是建構函式的繼承,一種是原型(prototype)的繼承:

   第一: 建構函式的繼承,比較簡單,只需要在子物件中新增程式碼:parent.apply(this, arguments);

function Cat(name,color){
    Parent.apply(this, arguments);
    this.name = name;
    this.color = color;
  }
第二:關於原型的繼承最優化的方法,利用空物件作為中介
function extend(Child, Parent) {

    var F = function(){};
    F.prototype = Parent.prototype;
    Child.prototype = new F();
    Child.prototype.constructor = Child;
    Child.uber = Parent.prototype;
  }
使用時,方法如下:
 extend(Cat,Animal);
  var cat1 = new Cat("大毛","黃色");
  alert(cat1.species); // 動物
第三,拷貝繼承

    我們也可以換一種思路,純粹採用"拷貝"方法實現繼承。簡單說,如果把父物件的所有屬性和方法,拷貝進子物件,不也能夠實現繼承嗎?

  function extend2(Child, Parent) {
    var p = Parent.prototype;
    var c = Child.prototype;
    for (var i in p) {
      c[i] = p[i];
      }
    c.uber = p;
  }