Javascript面向对象编程(1)-- JS对象的创建方式与优劣势

Javascript是一门真正的面向对象语言,而不是很多人认为的没有java/C++等语言语法的就不是面向对象语言。只是Javascript面向对象的实现是基于对象实现的,秉承一切皆对象的思想。
既然Javascript的面向对象是基于对象的,那我们在这里先来探讨一下Javascript的对象模型。

  • Javascript对象创建的方法
    • 对象字面量
          let  person1 = {
                name: 'Jack Ma',
                age: 60
          };
          let person2 = {
                name: 'Polly',
                age: 58
         } ;
      

对象字面量是最直接的对象创建方式,上面两个对象分别代表Jack Ma、Polly 两个人,他们除了成员一致外,没有实质关系,代码无法复用,使用不太方便。所以我们总结一下字面量的缺点有一下几点:

  • 首先,虽然都是对象,但脱离的面向对象的概念,没有抽象层。

  • 第二,两个对象都是表示一个类型的实例却没办法在逻辑层面表现出来。

  • 第三,代码复用低,每一个对象都要去构建相同的属性,很麻烦。

  • 第四,没有类型名称不利于继承,对面向对象是一大障碍。

  • 对象工厂函数方法

      let person = function (name, age) {
          return {name: name, age: age};
      };
      let person1 = person ('Jack Ma', 60);
      let person2 = person ('Polly', 58);
    

此方法解决了字面量中代码的复用问题,但是对继承等面向对象的支持还是不足。

  • 使用构造函数的方式
    function Person (name, age) {
          this.age  = age;
          this.name = name;
    }
   let person1 = new Person ('Jack Ma', 60);
   let person2 = new Person('Polly', 58);

构造函数就其实就是一个普通的函数,当对构造函数使用new进行实例化时,会将其内部this的指向绑定实例对象上,下面我们来创建一个Person构造函数(构造函数约定使用大写开头,和普通函数做区分)。
构造函数首先作为一个函数,当我们直接调用时,函数内部的this指针会指向函数当前的作用域。在一般情况下我们会将构造函数定义在全局环境中,所以这是this指向全局环境(window浏览器/global nodejs)。
当我们使用new调用构造函数实例话时,函数作用域发生改变,作用域指向了实例后的对象,所以这时this指向它的作用域时就变成了刚刚创建的实例了。所以创建完成的对象实例拥有了我们设置在this上面的所有属性。
(对象的创建就先说到这里。接下来我将总结new实例对象的过程秘辛)

    原文作者:远行的猪王学红
    原文地址: https://www.jianshu.com/p/96fe10dd7386
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞