JS笔记3:对象、函数与原型
JS中的对象包括内建对象、宿主对象、自定义对象
— 内建对象:由ES标准中定义的对象,在任何的ES的实现中都可以使用。比如:Math String Number Boolean Function Object.
— 宿主对象:由JS的运行环境提供的对象,主要指由浏览器提供的对象。比如 BOM DOM
— 自定义对象:自己创建的对象。
1 | let obj = new Object(); |
对象的比较与其他语言相似,位于堆区
使用对象字面量,可在创建对象的同时指定对象中的属性。用 属性名:属性值 来赋值
1 | let obj1 = { |
- 函数也是对象。
1 | function f1() { // 使用函数声明创建函数 |
调用函数函数时未传入的参数为 undefined,函数的返回值默认为 undefined
1
2
3
4
5
6
7
8
9
10function f1(a, b) {
return typeof a + " " + typeof b
};
f1(1); // "number undefined"
function f2() {};
function f3() {
return;
}
f2(); // undefined
f3(); // undefined由于函数也是对象,因此也可以作为参数传入
1
2
3
4function f(o) {
o();
};
f(function f1() {console.log("f1");});立即执行函数
1
2
3(function() {
alert("hello");
})();for…in 遍历对象的所有属性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23let obj1 = {
name : "Lisi",
age : 19,
mom : {
name : "Liwu",
age : 49
},
sayName: function() {
console.log(this.name);
}
};
for (let i in obj1) {
console.log(i + ":" + obj1[i]);
};
/*
* 输出如下:
* name:Lisi
* age:19
* mom:[object Object]
* sayName:function() {
* console.log(this.name);
* }
*/
构造函数用 new 调用
1)立即在堆中创建一个新的对象
2)将新建的对象设为函数中的 this
3)逐行执行构造函数的代码
4)返回所建对象
1 | function Person(name) { |
关键字 instanceof 可检查一个对象是否是某个类的实例
任何对象都是 Object 的实例
1
2
3let p1 = new Person();
console.log(p1 instanceof Person); // true
console.log(p1 instanceof Object); // true创建的每一个函数,都会自动添加一个属性 prototype,该属性值为一个对象,即原型对象
当函数作为构造函数调用时,其创建的对象都会有一个隐含属性指向构造函数的原型对象
1 | let p1 = new Person(); |
- 访问一个对象的某属性或方法时,先在对象本身中寻找,若未找到,则沿着原型链向上找
1
2
3
4
5
6
7
8
9
10
11
12function Person(age) {
this.age = age;
};
Person.prototype.a = 123;
Person.prototype.sayName = function() {
console.log(this.age);
}
let p1 = new Person(16);
let p2 = new Person(18);
console.log(p1.a); // 123
console.log(p2.__proto__); // Object { a: 123, … }
console.log(p2.sayAge()); // 18
in 运算符:依原型链检查是否含有指定属性
对象的 hasOwnProperty() 检查对象自身是否含有指定属性
1 | obj.__proto__.a = 2; |
- 调用函数时,浏览器每次都会传入两个隐藏的参数:this 与 arguments(封装实参的对象)
1
2
3
4
5function fun() {
console.log(arguments); // Arguments { 0: 12, 1: "aa", … }
console.log(arguments[arguments.length - 1]); // aa
console.log(arguments.callee == fun); // true
}