1.对象字面量
var person={
name:"zhuzhenwei",
age:18
};
这里也创建了一个对象实例,同样通过for-in语句,我们可以验证其也只有name和age两个属性,且在通过对象字面量表示法定义对象时,实际上不会调用Object构造函数。
关于对象字面量有以下一点需要注意的地方:
在末尾需加分号;表示结束。 在一个属性定义之后用逗号分隔,最后一个属性不需要 属性名可以加双引号,好处是我们可以包含错误的字符。并使用方括号表示法来访问对象的属性。
2.检索
JavaScript中的对象是可变的键控集合(keyed collections) 对象是属性的容器,其中每个属性都拥有名字和值。属性的名字可以是 包括字符串在内的任意字符串,属性值可以是除undefined值之外的任何值
JavaScript中的对象是无类别的,它对新属性的名字和值没有约束。对象适合 用于收集和管理数据。对象可以包含其他对象,所以它们可以容易地表示成 树形或图形结构(注意:树和图强大的数据结构)
JavaScript包括一个原型链特性,允许对象继承另一对象的属性。正确地使用它能 减少对象初始化的时间和内存消耗
var empty_object = {};
var stooge = {
"first-name":"Ouyang",
"last-name":"ping",
"yyl":"yyl"
}
alert(stooge["first-name"]); //Ouyang
alert(stooge.first-name);//NaN
alert(stooge.yyl)//yyl
alert(stooge.name);//undefined
||运算符可以用来填充默认值
var middle = stooge["middle-name"] ||"none";
flight.equipment // undefined
flight.equipment.model // throw "TypeError"
flight.equipment && flight.equipment.model //undefined
3.更新 对象的值可以用赋值语句来进行更新,原本的值会被新值覆盖,如果没有则会新创建 当你创建了一个对象后,你可以用点操作符或中括号操作符来更新对象的属性。
举个例子,让我们看看 ourDog:
var ourDog = {
"name": "Camper",
"legs": 4,
"tails": 1,
"friends": ["everything!"]
};
让我们更改它的名称为 “Happy Camper”,这有两种方式来更新对象的name属性:
ourDog.name = "Happy Camper";
ourDog["name"] = "Happy Camper";
更新 myDog 对象的name属性,让它的名字从 “Coder” 变成 “Happy Coder”
// 举例
var ourDog = {
"name": "Camper",
"legs": 4,
"tails": 1,
"friends": ["everything!"]
};
ourDog.name = "Happy Camper";
// Setup
var myDog = {
"name": "Coder",
"legs": 4,
"tails": 1,
"friends": ["Free Code Camp Campers"]
};
// Only change code below this line.
myDog.name="Happy Coder";
4.引用 对象之间引用只是传递了地址,新对象指向原来的地址,他并没有开辟新的内存空间
当从一个变量向另一个变量赋值引用类型的值时,同样也会将存储在变量中的对象的值复制一份放到为新变量分配的空间中。前面讲引用类型的时候提到,保 存在变量中的是对象在堆内存中的地址,所以,与简单赋值不同,这个值的副本实际上是一个指针,而这个指针指向存储在堆内存的一个对象。那么赋值操作后,两 个变量都保存了同一个对象地址,则这两个变量指向了同一个对象。因此,改变其中任何一个变量,都会相互影响:
var a = {}; // a保存了一个空对象的实例
var b = a; // a和b都指向了这个空对象
a.name = 'jozo';
console.log(a.name); // 'jozo'
console.log(b.name); // 'jozo'
b.age = 22;
console.log(b.age);// 22
console.log(a.age);// 22
console.log(a == b);// true
因此,引用类型的赋值其实是对象保存在栈区地址指针的赋值,因此两个变量指向同一个对象,任何的操作都会相互影响。
5.原型
原型概念 无论何时只要创建了一个函数,该函数就会有一个prototype属性,指向函数的原型对象。而原型对象会有一个constructor属性,包含一个指向构造函数的指针。当调用构造函数创建一个实例后,实例内部包含一个指针,指向构造函数的原型对象,浏览器上都支持这个属性为__proto__,这是一个实例与原型对象的联系。
原型链概念 原型链是一种机制,指的是JavaScript每个对象包括原型对象都有一个内置的__proto__属性指向创建它的函数对象的原型对象,即prototype。让原型对象等于另一个类型的实例,此时的原型对象将包含一个指向另一个原型的指针,相应地,另一个原型中也包含着一个指向另一个构造函数的指针。假如另一个原型又是另一个类型的实例,那么上述关系依然成立。如此层层递进,就构造了实例与原型的链条,这就是原型链的基本概念。
6.反射
反射机制指的是程序在运行时能够获取自身的信息。例如一个对象能够在运行时知道自己有哪些方法和属性。
在JavaScript中利用for(…in…)语句实现反射。
在JavaScript中有一个很方便的语法来实现反射,即for(…in…)语句,其语法如下:
for(var p in obj){
//语句
}
7.枚举 由于范例很简单,所以直接看 HTML 标签就 OK 了
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<script language="javascript" type="text/javascript">
Type.registerNamespace("BaoBeiMe");
//注册一个枚举
BaoBeiMe.EnumDepartment = function() {
}
BaoBeiMe.EnumDepartment.prototype = {
One: "信息部",
Two: "业务部",
Three: "财务部",
Four: "研发部"
}
BaoBeiMe.EnumDepartment.registerEnum("BaoBeiMe.EnumDepartment");
function Button1_onclick() {
var enumDepartment = new BaoBeiMe.EnumDepartment();
var lblMsg = $get('<%=lblMsg.ClientID %>');
lblMsg.innerText = "One 是 " + enumDepartment.One + " , " +
"Two 是 " + enumDepartment.Two + " , " +
"Three 是 " + enumDepartment.Three + " , " +
"Four 是 " + enumDepartment.Four + " ";
}
</script>
<div>
<input id="Button1" type="button" value="获取所以枚举值"
onclick="return Button1_onclick()" /><br />
<br />
<asp:Label ID="lblMsg" runat="server" Text=""></asp:Label>
</div>
</form>
</body>
</html>
8.删除
delect运算符可以用来删除对象的属性,移除对象中确定包含的属性,它不会触及原型链中的任何对象。
9.减少全局变量污染
- 使用命名空间、对象字面量的方式
var namespace={
fun1:function(){},
fun2:function(){},
}
把fun1和fun2定义为namespace的属性,减少变量和全局作用域污染
- 利用闭包封装私有变量,暴露接口与外部通信
var user=(function(){
var _name='admin',_age=23;
return {getUserInfo:function(){
return _name;
}}
})();
//外部调用
user.getUserInfo();//admin