JavaScript 对象基础
JavaScript 对象的基本形式、对象的创建方式、构造函数、包装类等
对象的格式
基本格式
对象使用一个{}进行包裹,内部属性以键值对形式声明
示例 var teacher = {
name: "pgjett",
age: "22",
teach: function () {
console.log("I teach javascript");
},
drink: function () {
console.log("I drink beer");
}
}
对象的的属性
属性的增删改查 var teacher = {
name: "pgjett",
var teacher = {
name: "pgjett",
age: "22",
teach: function() {
console.log("I teach javascript");
},
drink: function() {
console.log("I drink beer");
}
}
// 增加
teacher.smook = function(){
console.log("I smook");
}
// 删除
delete teacher.name;
// 改变
teacher.teach =function() {
console.log("I teach java");
}
// 查找/访问
console.log(teacher.name);
console.log(teacher["name"]);
// 最早的 JS 引擎使用 obj["name"] 访问
// 使用 obj.name 会自动转换成 obj["name"]
对象方法访问属性
一般将普通函数称之为函数,对象内的函数称之为方法 var teacher = {
name: "pgjett",
age: "22",
weight: "65",
teach: function() {
console.log("I teach javascript");
},
eat: function() {
this.weight++;
console.log("I eat, my weight is " + this.weight);
}
}
teacher.eat();
带参数的对象方法 var attendance = {
students: [],
join: function(name) {
this.students.push(name);
console.log(name + " 已到课");
},
leave: function(name) {
var idx = this.students.indexOf(name);
if (idx != -1) {
this.students.splice(idx, 1);
console.log(name + "早退");
}
}
}
attendance.join("张三");
attendance.join("李四");
attendance.join("王五");
attendance.join("赵六");
attendance.join("孙七");
attendance.leave("李四");
// 张三 已到课
// 李四 已到课
// 王五 已到课
// 赵六 已到课
// 孙七 已到课
// 李四早退
对象的创建方式
对象字面量
也叫对象直接量 var obj = {
name: "Jett",
age: 22""
}
内置构造函数
使用 new Object(),与对象直接量没什么区别 var obj = new Object();
obj.name = "Jett";
obj.age = "22";
自定义构造函数
自定义构造函数使用大驼峰命名,通过 new 创建对象实例,且 new 出的示例是不同对象,有各自的属性
自定义构造函数是 javascript 模块化、插件化的重要内容 function Teacher(){
this.name = "Jett";
this.age = 22;
this.teach =function(){
console.log("I teach javascipt");
}
}
var teacher1 = new Teacher();
var teacher2 = new Teacher();
teacher2.name = "John";
console.log(teacher1);
console.log(teacher2);
// Teacher{name: "Jett", age: 22, teach: teach(){}}
// Teacher{name: "John", age: 22, teach: teach(){}}
自定义构造函数传入参数 function Teacher(opt) {
this.name = opt.name
this.age = opt.age;
this.teach = function() {
console.log("I teach " + opt.course);
}
}
var teacher1 = new Teacher({
name: "Jett",
age: 22,
course: "javascript"
});
var teacher2 = new Teacher({
name: "John",
age: 25,
course: "java"
});
构造函数原理
this 的指向
不使用 new,直接执行,根据预编译原理,this 默认指向 window
在全局作用域中,this 代表 window function Car() {
this.color = "red";
this.brand = "BMW";
}
Car();
console.log(window.color);
console.log(this.color);
// red
// red
使用 new 实例化对象,this 指向该实例 function Car() {
this.color = "red";
this.brand = "BMW";
}
var car = new Car();
console.log(car.color);
this 转变的过程
当 new 一个构造函数时,就相当于该构造函数执行,它的 AO 中会有一个 this 指向一个默认的属性
当执行 this.color = "red";
this.brand = "BMW";
相当于在 this 上添加属性
使用 new 关键字后会将 this 抛出,赋值给一个引用
这就是一个实例对象,这个实例可以访问 color、brand 属性
构造函数中的 return
new 一个构造函数默认会隐式 return this
如果显式 return 一个原始值,实例对象不受影响
如果显式 retrn 一个引用值,new 出的实例将指向该引用值 function Car() {
this.color = "red";
this.brand = "BMW";
return 1;
}
var car = new Car();
console.log(car.color);
// red
包装类
Number
通过构造函数创建数字对象,可以设置属性
在运算中可以自动解包装
与此类似的还有 String,Boolean var a = new Number(1);
a.name = "a";
console.log(a);
console.log(a + 1);
// 打印
// Number{1, name: "a"}
// 2
原始值自定义方法和属性,每次访问都会被包装成相应类型的对象,仅仅是临时容器,执行后则销毁,再次访问又重新包装,只能访问到 undefined var a = 1;
a.name = "a";
// js 引擎将 a 包装成数字对象,
// 即 new Number(a).len = 3
// 临时容器没有变量保存,执行 delete,删除该 len 属性
console.log(a.name);
// 即 console.log(new Number(a).len)
// 打印 undefined
String
字符串原始值并没有 length 属性,实际上是包装成字符串对象后访问 length 属性 // js 引擎将 "123" 包装成字符串对象
var str = "123";
str.length = 1;
// 即 new String(str).length = 1;
console.log(str.length);
// 即 console.log(new String(str).length)
// 打印 3
对象链式调用
通过 return this 将对象抛出,以调用其他函数
```javascript
var sched = {
marning:function(){
console.log("marning studying");
return this;
},
noon:function(){
console.log("noon sleeping");
return this;
},
afternoon:function(){
console.log("afernoon shopping");
return this;
}
}
sched.marning().noon().afternoon();
```
对象枚举
for in 遍历对象属性 var obj = {
name: "Jett",
age: 22,
address: "安徽"
}
for( var key in obj) {
console.log(key, obj[key]);
}
// name Jett
// age 22
// address 安徽
用 in 判断对象是否有某个属性 var obj = {
name: "Jett",
age: 22,
address: "安徽"
}
console.log("name" in obj);
// true