标签:
对象基础
JavaScript有一种复杂数据类型,对象数据类型,和五种简单数据类型:数字(Number),字符串(String),布尔(Boolean),未定义
(Undefined),和空(Null)。
1. 什么是对象
对象是一组无序的原始数据类型(或引用数据类型)序列,并且这个序列以键值对的形式存储.序列中的每一项被称之为属性(函数称为方法),并且每一个属
性名必须是唯一的.
这是一个简单的对象:
var myFristObject = {
firstName:"first",
lastName:"last"
}
说明: 属性名可以是字符串或者数字,但如果属性名是数字,它就必须用方括号来取值.(讲解对象取值的方式)
var ageGroup = {
30:"children",
100:"very old"
};
console.log(ageGroup.30);//报错
console.log(ageGroup["30"]);//正确
作为一个javascript开发人员会经常使用到对象数据类型,常见的用途是用来存储数据和创建自定义的函数.
2. 引用数据类型和原始数据类型
引用数据类型和原始数据类型之间的主要区别之一在于引用数据类型的值是是以引用的形式存储的,而不是像原始数据类型那样以值的形式直接将值
存储到变量里。
原始数据类型:
var person = "Kobe";
var otherPerson = person;
person = "Bryant";
console.log(person);
console.log(otherPerson);
即使我们把person的值改了之后,otherPerson里面存储的依然是以前的值;
引用数据类型:
var person = {name:"Kobe"};
var otherPerson = person;
person.name = "Bryant";
console.log(person.name);
console.log(otherPerson.name);
在引用数据类型中,person和otherPerson存放的实际上是一个地址值而非一个真正的值,它指向的是这个对象属性所在的内存空间.
3. 对象数据属性所具有的特性
每个数据属性除了具有键值对的特性外,还有其他三个特性(这三个特性初始值都为true):
可配置性(Configurable):指明该属性是否可以被删除
var person = {};
Object.defineProperty(person, "name", {
configurable:false,
value:"Kobe"
});
Object.defineProperty(person, "age", {
configurable:true,
value:30
});
person.name = "Bryant";
person.age = 40;
delete person.name;
delete person.age;
console.log(person.name);
console.log(person.age);
枚举性(enumerable):指明该属性是否能在for/in中被返回
var person = {};
Object.defineProperty(person, "name", {
configurable:true,
enumerable: true,
value:"Kobe"
});
Object.defineProperty(person, "age", {
configurable:true,
enumerable: false,//将age属性隐藏
value:30
});
for(var x in person) {
console.log(x + ":" + person[x]);
}
可写性(writable):指明该属性能否被修改
var person = {};
Object.defineProperty(person, "name", {
writable:false,
value:"Kobe"
});
Object.defineProperty(person, "age", {
writable:true,
value:30
});
person.name = "Bryant";
person.age = 40;
console.log(person.name);
console.log(person.age);
4. 创建对象
4.1 对象式: 最普通也是最简单的一种创建方式,也可称之为JSON式对象
var person = {
name:"Kobe",
age:30,
sayName:function() {
console.log("I‘m " + this.name);
}
};
person.sayName();
4.2 函数式: 通过函数构建对象分成两种方式,一种为普通函数构建,通过函数的返回值获得对象,第二种为构造函数,通过new关键字来获取对象
4.2.1 普通函数: 这种构造方式是通过return关键字来获取到对象;该方式也称之为工厂方法
方式一:直接返回JSON式对象
function getPerson(name, age) {
return {
name:name,
age:age,
sayName:function() {
console.log("i‘m " + this.name);
}
};
}
var kobe = getPerson("Kobe", 30);
var bryant = getPerson("Bryant", 40);
console.log(kobe.name);
console.log(bryant.name);
方式二:使用Object对象构建,
function getPerson(name, age) {
var obj = new Object();
obj.name = name;
obj.age = age;
obj.sayName = function() {
console.log("i‘m " + this.name);
};
return obj;
}
var person = getPerson("Kobe", 30);
console.log(person.name);
console.log(person.age);
person.sayName();
4.2.2 构造函数: 构造函数实际上也是函数的一种表现形式,它的功能是通过new关键字调用构造函数获得一个新的对象(new关键字会隐式return )
方式一: 先声明后定义,首先创建对象,对象创建完成后给对象的属性赋值
//构造函数: 函数名第一个字母大写,用于区分普通函数
function Person() {}
//获取对象
var kobe = new Person();
//对象初始化
kobe.name = "kobe";
kobe.age = 30;
kobe.sayName = function() {
console.log("i‘m " + this.name);
}
kobe.sayName();
方式二:声明时定义,在创建对象的同时给对象的属性赋值
//构造函数
function Person(name, age) {
this.name = name;
this.age = age;
this.sayName = function() {
console.log("i‘m " + this.name);
}
}
//获得对象
var kobe = new Person("kobe", 30);
console.log(kobe.name);
console.log(kobe.age);
kobe.sayName();
说明:
1. 对象中的属性可以是任何一种数据类型, 包括字符串,数字,数组甚至是其他对象类型;
2. 以上两种方式都可以创建对象,针对sayName的方法,每次创建新的对象时,都会创建一个新的sayName方法,事实上,每个对象都应该共享同一个
函数.
标签:
原文地址:http://www.cnblogs.com/wanghaijian/p/5450728.html