美文网首页让前端飞web之路
【五】JavaScript对象:我们真的需要模拟类吗?

【五】JavaScript对象:我们真的需要模拟类吗?

作者: alanwhy | 来源:发表于2019-02-13 21:32 被阅读1次

首先,JS本身就是面向对象的,它并不需要模拟,只是JS实现面向对象的方式和主流的流派不太一样。

实际上,“基于类”并非面向对象的唯一形态,如果我们把视线从“类”移开,看看JS选择的原型系统,就是一个非常优秀的抽象对象的形式。

什么是原型?

原型是顺应人类自然思维的产物,用原型来描述对象的方法可以说是古已有之。

“基于类”的编程体长使用一个关注分类和类之间关系开发模型。这类语言中,总是先有类,再从类去实例化一个对象。类与类之间又可能会形成继承、组合等关系。

“基于原型”的编程更提倡程序员关注一系列对象实例的行为,之后再去关注如何将这些对象划分到最近的使用方式相似的原型对象。

原型系统的“复制操作”有两个实现思路:

  • 一个是并不真的去复制一个原型对象,而是使得新对象持有一个原型的引用;
  • 另一个是切实地复制对象,从此两个对象再无关联;

JS的原型

可以概括为两条:

  • 如果所有对象都有私有字段(prototype),就是对象的原型;
  • 读一个属性,如果对象本身没有,则会继续访问对象的原型,直到原型为空或者找到为止;

但是从ES6开始,JS提供了一系列内置函数,以便更为直接地访问操纵原型。三个方法分别是:

  • Object.create 根据指定的原型创建新对象,原型可以是null;
  • Object.getPrototypeOf 获得一个对象的原型
  • Object.setPrototypeOf 设置一个对象的原型

举个例子

var cat = {
    say(){
        console.log("meow~");
    },
    jump(){
        console.log("jump");
    }
}

var tiger = Object.create(cat,  {
    say:{
        writable:true,
        configurable:true,
        enumerable:true,
        value:function(){
            console.log("roar!");
        }
    }
})


var anotherCat = Object.create(cat);

anotherCat.say();

var anotherTiger = Object.create(tiger);

anotherTiger.say();

ES6中的类

推荐使用ES6的语法来定义类,而令function回归原本的函数语义。

ES6中引入class关键字,并且在标准中删除了所有class相关的私有属性描述,类的概念正式从属性升级成语言的基础设施

先看下类的基本写法:

class Rectangle {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
  // Getter
  get area() {
    return this.calcArea();
  }
  // Method
  calcArea() {
    return this.height * this.width;
  }
}

现有类语法中,getter/setter和method是兼容性最好的。
通过get/set关键字来创建getter,通过括号和大括号来创建方法,数据型成员最好写在构造器里面。

类的写法实际上也是由原型运行时来继承的,逻辑上JS认为每个类是有共同原型的一组对象,类中定义的方法和属性则会被写在原型对象上。

最重要的是,类提供了继承能力,举个例子:

class Animal { 
  constructor(name) {
    this.name = name;
  }
  
  speak() {
    console.log(this.name + ' makes a noise.');
  }
}

class Dog extends Animal {
  constructor(name) {
    super(name); // call the super class constructor and pass in the name parameter
  }

  speak() {
    console.log(this.name + ' barks.');
  }
}

let d = new Dog('Mitzie');
d.speak(); // Mitzie barks.

参考原文:JavaScript对象:我们真的需要模拟类吗?

相关文章

  • 【五】JavaScript对象:我们真的需要模拟类吗?

    首先,JS本身就是面向对象的,它并不需要模拟,只是JS实现面向对象的方式和主流的流派不太一样。 实际上,“基于类”...

  • (四)继承

    1.原型链 javascript中没有类的概念,需要利用原型链来模拟。我们知道,构造函数、原型对象、实例之间有如下...

  • JavaScript new 关键字

    new 关键字 在JavaScript中, new 关键字用来创建一个类(模拟类)的实例对象。 实例化对象之后, ...

  • 5月31号构造函数、ECMAscript(ES6)

    1,在很多面向对象语言中都有类的概念,但是在javascript(es5)中没有类。而我们可以通过构造函数来模拟一...

  • 构造函数、ECMAscript(ES6)

    1,在很多面向对象语言中都有类的概念,但是在javascript(es5)中没有类。而我们可以通过构造函数来模拟一...

  • 构造函数、ECMAscript(ES6)

    1,在很多面向对象语言中都有类的概念,但是在javascript(es5)中没有类。而我们可以通过构造函数来模拟一...

  • 构造函数,ECMAscript

    1,在很多面向对象语言中都有类的概念,但是在javascript(es5)中没有类。而我们可以通过构造函数来模拟一...

  • 构造函数,ECMAscript

    1,在很多面向对象语言中都有类的概念,但是在javascript(es5)中没有类。而我们可以通过构造函数来模拟一...

  • JavaScript-9面向对象

    JavaScript对象 JavaScript中提供了一个默认的类Object, 我们可以通过这个类来创建对象 由...

  • JavaScript模拟类Java面向对象编程

    一个标准的类java的JavaScript类 测试: new Person()和JSON.parse(person...

网友评论

    本文标题:【五】JavaScript对象:我们真的需要模拟类吗?

    本文链接:https://www.haomeiwen.com/subject/imkjeqtx.html