美文网首页
function,对象和class

function,对象和class

作者: 申_9a33 | 来源:发表于2022-03-23 20:27 被阅读0次

含义

  • 类:是抽象的,用来描述一个抽象事物
  • 对象:是具体的,是类的实例化

1.普通方法和属性

class

class Person1 {
  constructor(name){
    this.name = name
  }

  play(){
    console.log(`${this.name} 在打游戏`)
  }
}

const p1 = new Person1('德玛')
console.log(p1)
console.log(p1.name)
p1.play()
  • 输出结果


    image.png
  • 属性是直接挂载实例化的对象上面,而方法则是挂载[[Prototype]]上面
  • 实例化的对象上不存在__proto__
  • 实例化的[[Prototype]]指向的是一个对象

function

const Person2 = function(name){
  this.name = name
  this.play = function(){
    console.log(`${this.name} 在打游戏`)
  }
}
const p2 = new Person2('诺手')
console.log(p2)
console.log(p2.name)
p2.play()
  • 输出结果


    image.png
  • 属性,方法都是挂载实例上
  • 实例化的[[Prototype]]指向的也是一个对象

2. 静态方法和属性

class

class Person1 {
  static nickName

  static play(){
    console.log(`${this.nickName} 在打游戏`)
  }
}
Person1.nickName = '德玛西亚'
Person1.play()

const p1 = new Person1()
console.log(p1)
  • 输出结果


    image.png
  • 静态方法需要用类本身去调用
  • 实例化的对象上面不存在静态属性和方法

function

const Person2 = function(){
}
Person2.nickName = '洛克萨斯'
Person2.play = function(){
  console.log(`${this.nickName} 在打游戏`)
}
Person2.play()

const p2 = new Person2()
console.log(p2)
  • 输出结果


    image.png
  • 静态属性和方法需要用构造器调用
  • 实例化的对象上面不存在静态属性和方法

3.继承

继承使用

class Person {
  constructor(name){
    this.name = name
  }

  eat(){
    console.log(`${this.name} 在吃东西`)
  }

  play(){
    console.log(`${this.name} 在打游戏`)
  }
}

const p = new Person('德玛西亚')
p.eat()
p.play()

// 继承 Person
class Man extends Person {
  constructor(name){
    super(name)
  }

  // 重写play
  play(){
    console.log(`${this.name} 再打英雄联盟`)
  }
}
const m = new Man('洛克萨斯')
m.eat()
m.play()

class Son extends Man {
  constructor(name){
    super(name)
  }

  sleep(){
    console.log(`${this.name} 在睡觉`)
  }
}

const s = new Son('儿子')
s.eat()
s.play()
s.sleep()
  • 输出


    image.png
  • constructor 调用super,以执行父类的构造器

  • Man 继承 Person,并重写play方法.

  • Son 继承 Man,可以使用ManPerson的所有方法


原理(使用bebal 编译上述代码)

"use strict";

function _inheritsLoose(subClass, superClass) { 
   subClass.prototype = Object.create(superClass.prototype);
   subClass.prototype.constructor = subClass; 
   _setPrototypeOf(subClass, superClass); 
}

function _setPrototypeOf(o, p) { 
  _setPrototypeOf = Object.setPrototypeOf  || 
  function _setPrototypeOf(o, p) {
     o.__proto__ = p; 
    return o; 
  };
   return _setPrototypeOf(o, p); 
}

var Person = /*#__PURE__*/function () {
  function Person(name) {
    this.name = name;
  }

  var _proto = Person.prototype;

  _proto.eat = function eat() {
    console.log(this.name + " \u5728\u5403\u4E1C\u897F");
  };

  _proto.play = function play() {
    console.log(this.name + " \u5728\u6253\u6E38\u620F");
  };

  return Person;
}();

var p = new Person('德玛西亚');
p.eat();
p.play(); // 继承 Person

var Man = /*#__PURE__*/function (_Person) {
  _inheritsLoose(Man, _Person);

  function Man(name) {
    return _Person.call(this, name) || this;
  } // 重写play


  var _proto2 = Man.prototype;

  _proto2.play = function play() {
    console.log(this.name + " \u518D\u6253\u82F1\u96C4\u8054\u76DF");
  };

  return Man;
}(Person);

var m = new Man('洛克萨斯');
m.eat();
m.play();

var Son = /*#__PURE__*/function (_Man) {
  _inheritsLoose(Son, _Man);

  function Son(name) {
    return _Man.call(this, name) || this;
  }

  var _proto3 = Son.prototype;

  _proto3.sleep = function sleep() {
    console.log(this.name + " \u5728\u7761\u89C9");
  };

  return Son;
}(Man);

var s = new Son('儿子');
s.eat();
s.play();
s.sleep();

函数实现类,使用匿名函数,返回构造函数

var Person = /*#__PURE__*/function () {
  function Person(name) {
    this.name = name;
  }

  var _proto = Person.prototype;

  _proto.eat = function eat() {
    console.log(this.name + " \u5728\u5403\u4E1C\u897F");
  };

  _proto.play = function play() {
    console.log(this.name + " \u5728\u6253\u6E38\u620F");
  };

  return Person;
}();

函数实现继承

var Man = /*#__PURE__*/function (_Person) {
  _inheritsLoose(Man, _Person);

  function Man(name) {
    return _Person.call(this, name) || this;
  } // 重写play


  var _proto2 = Man.prototype;

  _proto2.play = function play() {
    console.log(this.name + " \u518D\u6253\u82F1\u96C4\u8054\u76DF");
  };

  return Man;
}(Person);
  • 匿名函数传入需要继承的函数
  • 创建一个需要的继承函数的prototype,赋值给自己,并且将prototype.constructor指向自己
  • 将自己的__proto__指向继承函数

相关文章

  • function,对象和class

    含义 类:是抽象的,用来描述一个抽象事物 对象:是具体的,是类的实例化 1.普通方法和属性 class 输出结果i...

  • 【学习笔记】ES6 class类的使用笔记

    class类 JavaScript语言的传统方法是通过构造函数,定义并生成新对象。function即使对象,对象既...

  • 热更新07_面向对象

    1.通过两个function实现面向对象 clone ,class 2.父类定义 father=class(“f...

  • Swift学习:class与struct

    Class (类) 1.属性: data member(描述对象状态) 2.方法: function member...

  • class创建组件与state关键字

    es6中class关键字,是实现面向对象编程的新形式class与function的区别在与: class有自己的生...

  • JS原型、原型链、构造函数理解

    一、函数对象(Function)和普通对象(Object) 由function定义或Function实例化的对象为...

  • 学习日记

    class 对象分类 function xxx 方法的名称 var $zzz 变量的名称 $xxx1 =new x...

  • JVM中class对象加载方式

    1 class对象详解 java中把生成Class对象和实例对象弄混了,更何况生成Class对象和生成instan...

  • class

    class class 与es5function差异class只能使用new命令执行,es5function可以直...

  • ES6的class概念(2018-06-20)

    一直以来,开发者都是使用函数function和原型prototype来模拟类class实现面向对象的编程。ES6给...

网友评论

      本文标题:function,对象和class

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