談談對js面向物件的理解
阿新 • • 發佈:2019-01-01
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; }