JavaScript面向对象编程实现模拟

目录
  • 前言
  • 1. 构造函数
  • 2. new的过程
    • 2.1 基础使用
    • 2.2 new.target
  • 3. 手动实现一个构造函数

前言

每个对象都是一个功能中心,具有明确分工,可以处理信息,处理信息,发出信息。面向对象编程具有灵活性、可复用性、模块化等好处,适合更多合作完成的大型项目。

1. 构造函数

构造函数的功能是生成对象,生成具有相同结构对象的函数。Java语言通过类实现面向对象,对象是类的实例,而Javascript则是通过构造函数作为对象的模板,使用prototype实现继承。

构造函数的几个特点

  • 构造函数内部使用了this关键字作为被生成的对象
  • 构造函数配合new 操作符使用
  • 构造函数的第一个字符一般大写用来区分普通函数
  • 构造函数默认返回一个新对象(this),如果手动返回值是引用数据类型会覆盖默认的返回值
function Person(name ){
  this.name = name;
};
const jack = new Person('jack'); //Person {name: 'jack'}
function Person(name ){
  this.name = name;
  return name;
};
const jack = new Person('jack'); //Person {name: 'jack'}
function Person(name ){
  this.name = name;
  return ['jack'];
};
const jack = new Person('jack'); //['jack']

2. new的过程

  • 生成一个新对象绑定给this
  • 将新对象的原型设置为构造函数的prototype属性
  • 执行代码,往this上添加属性
  • 返回this

2.1 基础使用

function Person(name ){
  this.name = name;
};
const jack = new Person('jack');
const tom = new Person('tom');
console.log(jack); //Person {name: 'jack'}
console.log(tom); //Person {name: 'tom'}

直接执行构造函数会怎么样?

function Person(){
  this.name = name;
};
const jack = Person('jack'); //undefined

构造函数的this指向了window,并没有返回一个对象,我们现在做以下兼容:

function Person(name){
 if(!(this instanceof Person)){
  return new Person(name);
 };
 this.name = name;
};

现在可以直接使用了

Person(name); //Object { name: "jack" }

2.2 new.target

在函数内部都可以使用new.target,如果函数是通过new.target调用的则返回被调用的构造函数否则返回undefined

function Person(){
  console.log(new.target);
};
new Person(); //function Person(){...}
Person(); //undefined

现在使用new.target进行构造函数的兼容

    function Person(name){
      if(!(new.target === Person)){
           return new Person(name);
      };
      this.name = name;
    };
    console.log(Person('jack')); //Object { name: "jack" }

3. 手动实现一个构造函数

  function myNew() {
      const args = Array.prototype.slice.call(arguments);
      const construct = args.shift();
      //创建this,并将原型设置为构造函数的prototype
      const context = Object.create(construct.prototype);
      //执行构造函数,注意这里参数是数组形式所以使用apply
      construct.apply(context, args);
      //返回
      const res = construct();
      if ((typeof res === 'object' || res === 'function') && typeof res !== 'null') {
        return res;
      } {
        return context;
      }
    };
    function Person(name, age) {
      this.name = name;
      this.age = age;
    };
    const jack = myNew(Person, 'jack', 21);
    //Person {name: 'jack', age: 21}

到此这篇关于JavaScript面向对象编程实现模拟的文章就介绍到这了,更多相关JS面向对象内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • JavaScript面向对象实现贪吃蛇游戏

    本文实例为大家分享了面向对象的贪吃蛇实现代码,供大家参考,具体内容如下 1 工具对象(Tools.js) 因为要随机生成食物,所以先将生成min-max范围内随机整数的方法提取出来.randomNum属性就是生成的随机数. function Tools(min,max){     min = Math.ceil(min);     max = Math.floor(max);     this.randomNum=Math.floor(Math.random() * (max - min + 1

  • JavaScript的面向对象你了解吗

    目录 1.面向对象编程介绍 1.1两大编程思想 1.2面向过程编程POP(Process-oriented-programming) 1.3面向对象编程OOP(Object-Oriented-Programming) 1.4面向过程和面向对象的对比 2.ES6中的类和对象 2.1对象 2.2类class 2.3创建类 2.4类constructor构造函数 2.5类添加方法 3.类的继承 3.1继承 3.2super关键字 4.三个注意点: 总结 1. 面向对象编程介绍 1.1 两大编程思想 面

  • TypeScript面向对象超详细分析

    目录 1 面向对象原则 2 TypeScript类 2.1 类的定义 2.2 创建实例对象 3 类的继承 4 static关键字 5 抽象类和抽象方法 6 类属性权限修饰符 6.1 public(公有的) 6.2 protected(受保护的) 6.3 private(受保护的) 6.4 readonly(只读) 7 存取器 1 面向对象原则 单一原则:一个类只负责一个职责. 里氏替换原则:子类可以在任何地方替换它的父类. 依赖倒置原则:代码要依赖于抽象的类,而不要依赖于具体的类:要针对接口或抽

  • javascript的面向对象编程一起来看看

    目录 函数的定义和使用 this指向问题 严格模式 高阶函数 闭包 递归 正则表达式 ES6 总结 年后来工作的我,be like: 而且刷微博刷着刷着也会遇到一群说出我心中所想的话: 呜呜呜~~(我是分割线)~~ 好啦,不管怎样生活总还是要继续的! 在年后的这些天里我一边炫沙糖桔一边也开始陆陆续续开始重新投入学习,主要学习的是面向编程对象. 同样先放上一张学习框架图: 函数的定义和使用 这一板块的内容主要是对之前Jquery的复习,复习了:函数的定义方法.函数的调用方法.(在这我就不做过多的赘

  • JavaScript面向对象编程实现模拟

    目录 前言 1. 构造函数 2. new的过程 2.1 基础使用 2.2 new.target 3. 手动实现一个构造函数 前言 每个对象都是一个功能中心,具有明确分工,可以处理信息,处理信息,发出信息.面向对象编程具有灵活性.可复用性.模块化等好处,适合更多合作完成的大型项目. 1. 构造函数 构造函数的功能是生成对象,生成具有相同结构对象的函数.Java语言通过类实现面向对象,对象是类的实例,而Javascript则是通过构造函数作为对象的模板,使用prototype实现继承. 构造函数的几

  • 再谈javascript面向对象编程

    另外这篇文章是一篇入门文章,我也是才开始学习Javascript,有一点心得,才想写一篇这样文章,文章中难免有错误的地方,还请各位不吝吐槽指正 吐槽Javascript 初次接触Javascript,这门语言的确会让很多正规军感到诸多的不适,这种不适来自于Javascript的语法的简练和不严谨,这种不适也来自Javascript这个悲催的名称,我在想网景公司的Javascript设计者在给他起名称那天一定是脑壳进水了,让Javascript这么多年来受了这么多不白之冤,人们都认为他是Java的

  • JavaScript面向对象编程入门教程

    尽管面向对象JavaScript与其他语言相比之下存在差异,并由此引发了一些争论,但毋庸置疑,JavaScript具有强大的面向对象编程能力 本文先从介绍面向对象编程开始,然后回顾JavaScript对象模型,最后演示JavaScript中的面向对象编程概念. JavaScript回顾 如果你对诸如变量(variables).类型(types).函数(functions).以及作用域(scope)等JavaScript概念觉得心里没底,那么你可以阅读重新介绍JavaScript中的这些主题.你还

  • Javascript 面向对象编程(一) 封装

    学习Javascript,最难的地方是什么? 我觉得,Object(对象)最难.因为Javascript的Object模型很独特,和其他语言都不一样,初学者不容易掌握. 下面就是我的学习笔记,希望对大家学习这个部分有所帮助.我主要参考了以下两本书籍: <面向对象的Javascript>(Object-Oriented JavaScript) <Javascript高级程序设计(第二版)>(Professional JavaScript for Web Developers, 2nd

  • 浅谈javascript 面向对象编程

    感叹是为了缓解严肃的气氛并引出今天要讲的话题,"javascript面向对象编程",接下来,我们围绕面向对象的几大关键字:封装,继承,多态,展开. 封装:javascript中创建对象的模式中,个人认为通过闭包才算的上是真正意义上的封装,所以首先我们先来简单介绍一下闭包,看下面这个例子: 复制代码 代码如下: <script type="text/javascript"> function myInfo(){ var name ="老鱼&quo

  • JavaScript 面向对象编程(2) 定义类

    本文承接上一篇JavaScript面向对象编程(1) 基础. 上篇说过,JavaScript没有类的概念,需要通过函数来实现类的定义.先通过一个例子说明: 复制代码 代码如下: function myClass() { var id = 1; var name = "johnson"; //properties this.ID = id; this.Name = name; //method this.showMessage = function() { alert("ID:

  • 老鱼 浅谈javascript面向对象编程

    感叹是为了缓解严肃的气氛并引出今天要讲的话题,"javascript面向对象编程",接下来,我们围绕面向对象的几大关键字:封装,继承,多态,展开. 封装:javascript中创建对象的模式中,个人认为通过闭包才算的上是真正意义上的封装,所以首先我们先来简单介绍一下闭包,看下面这个例子: 复制代码 代码如下: <script type="text/javascript">// <![CDATA[ function myInfo(){ var nam

  • 深入剖析JavaScript面向对象编程

    二. Javascript 面向对象编程:构造函数的继承 本节主要介绍,如何生成一个"继承"多个对象的实例. 比如,现在有一个"动物"对象的构造函数, function Animal(){ this.species = "动物"; } 还有一个"猫"对象的构造函数, function Cat(name,color){ this.name = name; this.color = color; } 怎样才能使"猫&qu

  • Javascript面向对象编程

    Javascript的重要性 使用率 1.在web应用中,涉及到前端界面编程基本上都要用到javascript语言: 2.Web2.0及Ajax推动了javascript语言. 3.随着大量的c/s应用转向b/s,富客户端技术的不断推广,javascript语言的应用范围还将不断加大: javascript的特点 简单 动态 基于对象(面向对象) Javascript面向对象概述 Javascript是一种面向(基于)对象的动态脚本语言,是一种基于对象(Object)和事件驱动(EventDri

  • javascript 面向对象编程基础 多态

    Javascript已经可以模拟出面向对象的封装和继承特性,但是不幸的是Javascript对多态特性的支持非常弱!其它面向对象语言的多态一般都由方法重载和虚方法来实现多态,Javascript也通过这两种途径来实现! 重载:由于Javascript是弱类型的语言,而且又支持可变参数,当我们定义重载方法的时候,解释器无法通过参数类型和参数个数来区分不同的重载方法,因此方法重载是不被支持的!当先后定义了同名的方法的时候,后定义的方法会覆盖先定义的方法! 既然解释器无法分辨重载方法,那就手动区分不同

随机推荐