JavaScript 核心概念:Promise、原型链与面向对象
一、Promise 基本执行与原型验证
const p = new Promise((resolve, reject) => {
console.log('1');
setTimeout(() => {
console.log('3');
resolve('完成了');
}, 1000);
});
console.log('2');
p.then(data => {
console.log(data);
}).catch(err => {
console.log(err);
})
console.log(p.__proto__ === Promise.prototype, '///////////');
console.log(p.__proto__, '///////////');
- 执行顺序:先输出
1,再输出2,1 秒后输出3然后输出完成了 p.__proto__ === Promise.prototype结果为true,实例的隐式原型指向构造函数的显式原型- 打印
p.__proto__即为Promise.prototype对象
二、原型链:面向对象的本质
JS 面向对象不是血缘关系,而是原型链关系。实例的
__proto__指向原型对象。
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.specie = '人类';
let zhen = new Person('正宗', 10);
console.log(zhen.specie); // 人类
const kong = {
name: '孔子',
hobbies: ['读书', '写作', '旅游']
}
zhen.__proto__ = kong;
console.log(zhen.hobbies); // ['读书', '写作', '旅游']
- 通过修改
__proto__可以动态改变原型链 zhen原本指向Person.prototype,修改后指向kong,因此能访问hobbies
三、原型对象的 constructor 属性
原型对象
constructor指向构造函数,动态关系。火车比喻:车头(constructor)与车身(原型对象)分开。
console.log(Person.prototype.constructor === Person); // true
console.log(zhen.__proto__.constructor === Person); // true(修改前)
- 修改
zhen.__proto__ = kong后,zhen.constructor不再指向Person - 印证
constructor的动态性
四、Promise.all
- Promise 是 ES6 提供的异步解决方案
- 实例
__proto__指向原型对象 - JS 面向对象不是血缘关系,而是原型链关系
- 原型对象
constructor指向构造函数(动态)——火车/车,车头(constructor)与车身分开