javascript 對象的深入理解

1.普通函數與構造函數
普通函數與構造函數本質上沒有任何區別,只是我們調用的方式不同而已,關鍵在於一個字 new。
調用構造函數:new function_name();
調用普通函數:function_name();
在函數中有一個this對象,this始終代表該函數的調用者。
如果是構造函數,this就是構造出來的新對象。
如果是普通函數,this就是 window 對象。
如果使用new 關鍵字調用,那麼函數的 return 語句不再起作用,因爲這時還回的是 this 對象。
function Boo(name){
this.name=name;
  this.whatAreYou=function(){
  return 'I am a '+ this.name;
  };
}
var obj  = new Boo("obj");
Boo.name = "Boo";
alert(obj.name + "\n" + Boo.name);




2.關於js對象的動態特性
對象的成員屬性和方法可以動態添加。
function Foo(){
	this.name="Foo";
}
var obj = new Foo();
obj.name = "Foo1";
obj.m = "m";
delete obj.name;
alert("name:"+obj.name+"\nm:"+obj.m);




3.prototype 對象
prototype對象只有函數纔有,而new創建的對象該屬性,她是構造函數創建對象所參考的原型。
如果如果向prototype對象添加屬性和方法,那麼當下次使用new創建對象時,會以最新的prototype爲參考原型。
如果要修改和刪除原型中的屬性,只能給prototype賦值一個新的對象,而不能修改prototype的屬性
Js的所有對象都是基於原型(prototype)來創建的。她的繼承機制默認是原型對象的繼承。
function ClassA() {
}

ClassA.prototype.color = "blue";
ClassA.prototype.sayColor = function () {
    alert(this.color);
};

function ClassB() {
}

ClassB.prototype = new ClassA();




4. 創建對象最好採用下面方式
用構造函數定義對象的成員屬性屬性,用原型方式定義對象的成員方法。
這樣的好處是:每個對象都共享一個方法,並且都具有自己獨立的屬性實例。

function Car(sColor,iDoors,iMpg) {
  this.color = sColor;
  this.doors = iDoors;
  this.mpg = iMpg;
  this.drivers = new Array("Mike","John");
}
Car.prototype.showColor = function() {
  alert(this.color);
};
var oCar1 = new Car("red",4,23);
var oCar2 = new Car("blue",3,25);
oCar1.drivers.push("Bill");
alert(oCar1.drivers); //輸出 "Mike,John,Bill"
alert(oCar2.drivers); //輸出 "Mike,John"


發佈了54 篇原創文章 · 獲贊 36 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章