JavaScript 核心概念:Promise、原型链与面向对象

2 阅读1分钟

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)与车身分开