對象
定義
- 在JavaScript中是沒有類的概念的,只有對象。無論是字符串,數值,數組還是函數,其本質都是對象。此外,JavaScript是允許自定義對象。什麼是對象呢?簡而言之,對象是帶有屬性和方法的特殊數據類型
1、基於已有對象擴充其屬性和方法
- 簡單的創建一個對象,然後動態地爲其增加屬性和方法。
var object=new Object();
object.name="zhangsan";
object.sayName=function()
{
this.name=name;
}
object.sayName("lisi");
2、工廠方法
- 工廠方式的優點在於你不需要每次擴充方法和屬性,一次建成後就可以產生多個對象,無需關注創建細節,甚至不需要關注具體類的類名。
function factory()
{
var object = new Object();
object.username = "zhangsan";
object.password = "123";
object.get = function()
{
return (this.username+","+this.password);
}
return object;
}
var object1 = factory();
object1.get();
var object2 = factory();
- 好的對象創建方式應該滿足方法可以被多個對象共享,而屬性私有,使代碼更加簡略。同時,也可以將上述的程序改寫爲帶參數的工廠創建方式。改進後的代碼如下:
function get(){
return (this.username+","+this.password);
}
function factory(username,password){
var object = new Object();
object.username = username;
object.password = password;
object.get = get;
return object;
}
var object1 = factory("zhangsan","123");
object1.get();
var object2 = factory("lisi","456");
3、構造函數方式
- 使用構造函數方式時,JavaScript引擎會在第一行代碼執行前爲我們生成一個對象,同時含有一個隱藏的return語句,將生成的對象返回。因此,在函數體內,無需顯性地聲明。
function Person(){
//在執行第一行代碼前,js自動生成一個對象
this.username = "zhangsan";
this.password = "123";
this.get = function(){
return (this.username+","+this.password);
}
//隱藏的return語句,將生成的對象返回
}
var person = new Person();
person.get();
同理,也可以將其改爲可傳遞參數的構造函數。
4、使用原型(prototype)方式
- 單純使用原型方式定義對象無法在構造函數中爲屬性賦初值,只能在對象生成後再去改變屬性值。
function Person()
{
}
Person.prototype.username = "zhangsan";
Person.prototype.password = "123";
person.prototype.get = function(){
return (this.username+","+this.password);
}
var person = new Person();
person.username = "lisi";
person.password = "456";
person.get();
- 如果使用原型方式對象,那麼生成的所有對象會共享原型中的屬性,這樣一個對象改變了該屬性也會反映到其他對象當中。可以使用原型+構造函數方式來解決這個問題,使對象之間的屬性互不干擾,各個對象間共享同一個方法。這也是推薦使用的方法。
function Person()
{
this.username = new Array();
this.password = "";
}
Person.prototype.get = function()
{
return (this.username+","+this.password);
}
var p1 = new Person();
var p2 = new Person();
p1.username.push("zhangsan");
p1.password = "123";
p2.username.push("lisi");
p2.password = "456";
p1.get();
p2.get();
5、動態原型方式
在構造函數中,通過標誌量讓所有對象共享一個方法,而每個對象都擁有自己的屬性。
function Person()
{
this.username = "zhangsan";
this.password = "123";
if(typeof Person.flag == "undefined")
{
Person.prototype.get = function()
{
return (this.username+","+this.password);
}
Person.flag = true;
}
}
var p1 = new Person();
var p2 = new Person();
p1.get();
p2.get();
以上轉載自https://blog.csdn.net/qq_41690306/article/details/79253501
*定義
* 字面量
* 構造函數
* 格式: {屬性名:屬性值,屬性名:屬性值}
* 操作(屬性名:[],點語法)
* 增 添加一個屬性
* 刪 刪除一個屬性
* 改 修改一個現有屬性
* 查 讀取屬性名對應的屬性值
* 讀取不存在的屬性得到:undefined
* 遍歷
*/
// 字面量
//
var person = {
name:'laoxie',
age:18,
gender:'男',
hobby:['寫代碼','休閒會所','羽毛球']
}
// 添加屬性
// person['nickname'] = '小謝';
person.nickname = '小謝';
// 刪除屬性
// delete
// delete person['hobby'];
delete person.hobby;
// 修改
person.age = 19;
// 讀取屬性值
console.log(person.name)
console.log(person);
// 讀取所有屬性
// 遍歷對象全部屬性:for...in
for(var key in person){
// 遍歷過程分別把屬性名賦值給key
// 1.var key=name;
// 2.var key=age
// 3.var key=gender
// 4.var key=nickname
// console.log(key);
// 獲取key對應的屬性值
console.log(key,person[key]);//person.key
}
下面轉載自老謝