跟着coderwhy学习JavaScript高级(十)

294 阅读1分钟

创建对象的内存表现

function Person(){}
var p1 = new Person();
var p2 = new Person();

image.png

赋值为新对象内存表现

   function foo() { }

    foo.prototype = {
      name: "why",
      age: 18,
      height: 188
    }
    
    // 修正constructor指向 以及还原enumerable
    Object.defineProperty(foo.prototype, "constructor", {
      value: foo,
      enumerable: false,
      writable: true,
      configurable: true
    })

    var p1 = new foo();
    var p2 = new foo();
    console.log(p1.name)
    console.log(p2.name)

    console.log(Object.getOwnPropertyDescriptor(foo.prototype,"constructor"))

image.png

类和对象

在JavaScript其实本来没有类的概念,哪怕是ES5以后的class,严格意义上来说也只是构造函数的语法糖,之所以喜欢称之为类,因为JavaScript也可以面向对象开发。

function Person() {}

var p1 = new Person();
var p2 = new Person();

面向对象的特性

面向对象有三大特性:继承、封装、多态。

  • 继承: 继承是面向对象中非常重要的,不仅仅可以减少重复代码的数量,也是多态前提(纯面向对象中)
  • 封装: 我们前面将属性和方法封装到一个类中,可以称之为封装的过程
  • 多态: 不同的对象在执行时表现出不同的形态

再谈JavaScript原型链

在实现真正的继承之前,我们再来看一下一个非常重要的概念:原型链

image.png

Object的原型

Object是所有类的父类,它的原型是[Object: null prototype] {},事实上这个原型就是我们最顶层的原型了,从Object直接创建出来的对象的原型都是 [Object: null prototype] {}。

Object特殊的地方

  • 该对象有原型属性,但是它的原型属性已经指向的是null,也就是已经是顶层原型了;
    var obj = {}
    console.log(obj.__proto__)  //[Object: null prototype] {}
    console.log(obj.__proto__.__proto__)  null
  • 该对象上有很多默认的属性和方法

image.png

  • 该对象是所有类的父类
    function Person(name, age){
        this.name = name;
        this.age = age;
    }
    
    var p1 = new Person("why",18);

image.png