javascript對象的創建

 

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();



 

JavaScript中的繼承。 

1) 對象冒充 

//繼承第一種方式:對象冒充

function Parent(username)
{
	this.username = username;

	this.sayHello = function()
	{
		alert(this.username);
	}
}

function Child(username, password)
{
	//下面三行代碼是最關鍵的代碼
	this.method = Parent;
	this.method(username);
	delete this.method;

	this.password = password;

	this.sayWorld = function()
	{
		alert(this.password);
	}
}

var parent = new Parent("zhangsan");
var child = new Child("lisi", "1234");

parent.sayHello();

child.sayHello();
child.sayWorld();


2) call方法方式。 

call方法是Function對象中的方法,因此我們定義的每個函數都擁有該方法。可以通過函數名來調用call方法,call方法的第一個參數會被傳遞給函數中的this,從第2個參數開始,逐一賦值給函數中的參數。 

//使用call方式實現對象的繼承

function Parent(username) {  this.username = username;

 this.sayHello = function()  {   alert(this.username);  } }

function Child(username, password) {  Parent.call(this, username);

 this.password = password;

 this.sayWorld = function()  {   alert(this.password);  } }

var parent = new Parent("zhangsan");

var child = new Child("lisi", "123");

parent.sayHello();

child.sayHello(); child.sayWorld();

 

 

3) apply方法方式 

//使用apply方法實現對象繼承

function Parent(username)
{
	this.username = username;

	this.sayHello = function()
	{
		alert(this.username);
	}
}

function Child(username, password)
{
	Parent.apply(this, new Array(username));

	this.password = password;

	this.sayWorld = function()
	{
		alert(this.password);
	}
}


var parent = new Parent("zhangsan");
var child = new Child("lisi", "123");

parent.sayHello();

child.sayHello();
child.sayWorld();


 

4)原型鏈方式(無法給構造函數傳參數) 

//使用原型鏈(prototype chain)方式實現對象繼承

function Parent()
{

}

Parent.prototype.hello = "hello";
Parent.prototype.sayHello = function()
{
	alert(this.hello);
}

function Child()
{

}

Child.prototype = new Parent();

Child.prototype.world = "world";
Child.prototype.sayWorld = function()
{
	alert(this.world);
}

var child = new Child();

child.sayHello();
child.sayWorld();



5)混合方式(推薦) 

//使用混合方式實現對象繼承(推薦)

function Parent(hello)
{
	this.hello = hello;
}

Parent.prototype.sayHello = function()
{
	alert(this.hello);
}

function Child(hello, world)
{
	Parent.call(this, hello);

	this.world = world;
}

Child.prototype = new Parent();

Child.prototype.sayWorld = function()
{
	alert(this.world);
}

var child = new Child("hello", "world");

child.sayHello();
child.sayWorld();



作者:csh624366188 發表于2012-4-11 12:58:52 原文鏈接
閱讀:253 評論:1 查看評論