JavaScript中定義對象的幾種方式(JavaScript中沒有類的概念,只有對象):
1) 基於已有對象擴充其屬性和方法:
var object = new Object();
object.name = "zhangsan";
object.sayName = function(name)
{
this.name = name;
alert(this.name);
}
object.sayName("lisi");
2)工廠方式
//工廠方式建立對象
function createObject()
{
var object = new Object();
object.username = "zhangsan";
object.password = "123";
object.get = function()
{
alert(this.username + ", " + this.password);
}
return object;
}
var object1 = createObject();
var object2 = createObject();
object1.get();
帶參數的構造方法:
function createObject(username, password)
{
var object = new Object();
object.username = username;
object.password = password;
object.get = function()
{
alert(this.username + ", " + this.password);
}
return object;
}
var object1 = createObject("zhangsan", "123");
object1.get();
讓一個函數對象被多個對象所共用,而不是每一個對象擁有一個函數對象。
function get()
{
alert(this.username + ", " + this.password);
}
function createObject(username, password)
{
var object = new Object();
object.username = username;
object.password = password;
object.get = get;
return object;
}
var object = createObject("zhangsan", "123");
var object2 = createObject("lisi", "456");
object.get();
object2.get();
3) 建構函式方式
function Person()
{
//在執行第一行代碼前,js引擎會為我們產生一個對象
this.username = "zhangsan";
this.password = "123";
this.getInfo = function()
{
alert(this.username + ", " + this.password);
}
//此處有一個隱藏的return語句,用於將之前產生的對象返回
}
var person = new Person();
person.getInfo();
可以在構造對象時傳遞參數
function Person(username, password)
{
this.username = username;
this.password = password;
this.getInfo = function()
{
alert(this.username + ", " + this.password);
}
}
var person = new Person("zhangsan", "123");
person.getInfo();
4)原型(“prototype”)方式
//使用原型(prototype)方式建立對象
function Person()
{
}
Person.prototype.username = "zhangsan";
Person.prototype.password = "123";
Person.prototype.getInfo = function()
{
alert(this.username + ", " + this.password);
}
var person = new Person();
var person2 = new Person();
person.username = "lisi";
person.getInfo();
person2.getInfo();
*****************
function Person()
{
}
Person.prototype.username = new Array();
Person.prototype.password = "123";
Person.prototype.getInfo = function()
{
alert(this.username + ", " + this.password);
}
var person = new Person();
var person2 = new Person();
person.username.push("zhangsan");
person.username.push("lisi");
person.password = "456";
person.getInfo();
person2.getInfo();
如果使用原型方式對象,那麼產生的所有對象會共用原型中的屬性,
這樣一個對象改變了該屬性也會反應到其他對象當中。
單純使用原型方式定義對象無法在建構函式中為屬性賦初值,只能在對象產生後再去改變屬性值。
使用原型+建構函式方式來定義對象,對象之間的屬性互不干擾,各個對象間共用同一個方法
//使用原型+建構函式方式來定義對象
function Person()
{
this.username = new Array();
this.password = "123";
}
Person.prototype.getInfo = function()
{
alert(this.username + ", " + this.password);
}
var p = new Person();
var p2 = new Person();
p.username.push("zhangsan");
p2.username.push("lisi");
p.getInfo();
p2.getInfo();
5) 動態原型方式:在建構函式中通過標誌量讓所有對象共用一個方法,而每個對象擁有自己的屬性。
function Person()
{
this.username = "zhangsan";
this.password = "123";
if(typeof Person.flag == "undefined")
{
alert("invoked");
Person.prototype.getInfo = function()
{
alert(this.username + ", " + this.password);
}
Person.flag = true;
}
}
var p = new Person();
var p2 = new Person();
p.getInfo();
p2.getInfo();