1. 构造函数和原型
1.1 构造函数
new 在执行时会做四件事情:
- 在内存中创建一个新的空对象
- 让 this 指向这个新的对象
- 执行构造函数里面的代码,给这个新对象添加属性和方法
- 返回这个新对象(所以构造函数里面不需要 return)
1.2 成员
-
静态成员:在构造函数上添加的成员称为静态成员,只能通过构造函数本身来访问
function Star (name, age) { this.name = name; this.age = age; this.sing = function(){ console.log('我会唱歌'); } } let ldh = new Star('刘德华', 13); alert(ldh.name); // 刘德华 alert(Star.name); // underfined -
实例成员:在构造函数内部创建的对象称为实力成员,只能由实例化的对象来访问
function Star (name, age) {
this.name = name;
this.age = age;
this.sing = function(){
console.log('我会唱歌');
}
}
let ldh = new Star('刘德华', 13);
alert(ldh.name); // underfined
alert(Star.name); // 刘德华
1.3 构造函数的问题
构造函数方法虽然好用,但是存在浪费内存的问题
1.4 构造函数原型 prototype
构造函数上定义的函数是所有对象共享的
JavaScript 规定每一个对象都会有一个 prototype 属性,我们可以把那些不变的方法,直接定义在 prototype 对象上,
这样所有的对象实例都可以共享一个方法
function Star (name, age) {
this.name = name;
this.age = age;
// 错误写法
//this.sing = function () {
// console.log('我会唱歌')
//}
}
// 正确写法
Star.prototype.sing = function() {
console.log('我会唱歌');
}
1.5 对象原型 _proto_
每一个对象都会有一个属性_proto_指向构造函数的 prototype 原型对象,之所以我们对象能够使用构造函数 prototype 原型对象的属性和方法,就是因为_proto_的存在
_proto_对象原型和原型对象prototype等价_proto_指向对象的prototype
1.6 对象的 constructor 属性
主要是告诉我们这个对象是由哪一个构造函数创建出来的
function Star (name, age) {
this.name = name;
this.age = age;
}
let ldh = new Star('刘德华', 13);
console.log(ldh._proto_.constructor); // Star
1.7 构造函数、实例、原型对象三者的关系
1.8 原型链
1.9 JavaScript 的成员查找机制(规则)
- 当访问一个对象的属性(方法),会首先看这个对象自身是否具有这个属性
- 如果没有就查找他的原型(
__proto__指向的prototype原型对象) - 如果还没有就查找原型对象的原型(
Object的原型对象) - 依此类推一直找到
Object为止(null)
1.10 this 指向问题
- this 指向调用者