严格来说, JS 并不是一个面向对象的语言, 类似 Java, Python, C++ 这样的. JS 的独特精妙的设计其实是 原型 prototype 因此这里讲一嘴面向对象其实是为了后面引出原型的东西.

总之, JS 的面向对象 (封装, 继承, 多态) 并不真正存在, 但可以巧用 prototype 近似实现而已.

后来看作者自己说之所以搞这么一通主要也是为了靠近和迎合一下 Java 而已. 但 JavaScript 和 Java 除了名字有点像, 其他哪里都不像, 完全是两个领域的东西.

new 调用函数 4 步走

在 js 中函数的调用大致有好几种常见的, 如 函数声明调用, 匿名函数调用, 对象.方法调用, call 和 apply 调用. 而这里将要说的一种调用是通过 new 来调用函数.

new 函数()

注意这里的 new 和其他面向对象的语言不太一样, 并非是 new 一个对象这么简单哦, 但这里呢还是从规则和语法层面先了解再说吧, 它主要会进行 "四步走":

  • 函数体内会自动创建一个空对象 {}
  • 函数的上下文 (this) 会指向这个空对象
  • 函数体内的语句会执行
  • 函数会自动返回上下文 this 不论函数是否有 return
function fn() {
this.a = 1
this.b = 2
} var obj = new fn()
console.log(obj);

这里就用了 new 来调用函数, 咱们就仔细来分析一波这个过程吧.

// 第一步: 创建空对象
var obj = {} // 第二步: this 指向这个空对象
this = obj // 第三步: 函数体内的语句执行
obj = { a: 1, b: 2} // 第四步: 函数自动返回 this
return this

因此上例 new 调用函数()程序的执行结果就是返回一个对象, { a: 1, b: 2 }. 这个 new 来调用函数会自动返回一个对象, 且会执行一些逻辑就还是有点东西的哦.

构造函数

就是类创建时的一些自动调用的方法呀, 初始化啥的, 即 Java 类里面的同类名一致的方法实现, 或者是 Python 类里面的 def __ init __ 它的内部语句会给刚创建的对象 (实例化) 添加若干属性和方法, 助力其完成对象的初始化.

在 JS 中构造函数必须要通过 new 进行调用, 开发者们也约定构造函数命名时首字母要大写.

当然咱不遵守约定就小写也是行的, 只是有点不讲武德而已.

function People(name, age, sex) {
this.name = name
this.age = age
this.sex = sex
} var youge = new People('油哥', 28, '男')
var yaya = new People('亚亚', 18, '女')
  • 构造函数的关键在于 new 关键字调用, 而非是否函数首字母大小写
  • 构造函数中的 this 指向实例对象而非函数本身

接着尝试给对象添加一下方法看看:

function People(name, age, sex) {
this.name = name
this.age = age
this.sex = sex this.sayHi = function () {
console.log('我是: ', this.name, '今年: ', this.age, '岁啦!');
}
} var youge = new People('油哥', 28, '男')
var yaya = new People('亚亚', 18, '女') youge.sayHi()
yaya.sayHi()
PS C:\Users\Administrator\Desktop> node test.js
我是: 油哥 今年: 28 岁啦!
我是: 亚亚 今年: 18 岁啦!

类与实例

上面所谈的关于 JS 中通过构造函数便基本实现了面向对象的一些核心要素. 比如在写构造函数 People 时, 我们用的核心思想是 抽象 . 然后再通过 new 函数() 的四步走时, 创建了新对象, 添加了一些属性和方法, 则实现了 封装 和进行实例化.

计算机其实就是对现实世界的抽象. 里面的类和实例也对应着现实世界中的 "归类 和 个体".

从编程语言来看呢, Java, C++, Python 是面向对象的 OO 语言, 而 JavaScript 是基于对象 object-based 的语言. JS 中的构造函数可以类比于面向对象里面的 class . 但二者的实现逻辑是完全不同的. JS 的独特之处是基于原型 prototype 的设计哦.

当然在 ES6 以后 JS 也引入了一个 class 的关键字 和构造函数 constructor 来模拟纯面向对象语言的特性, 如继承. 但本质上还是基于原型链来展开的.

关于构造函数和类的简单认知就差不多了, 核心还是为了引出 JS 原型 这个有点牛的东西.

JS 构造函数与类的更多相关文章

  1. 通过寄生组合式继承创建js的异常类

    最近项目中在做js的统一的异常处理,需要自定义异常类.理想的设计方案为:自定义一个异常错误类BaseError,继承自Error,然后再自定义若干个系统异常,例如用户取消异常.表单异常.网络异常,这些 ...

  2. 深入研究js构造函数和原型

    很快就要从新浪离职了,最近心情比较轻松,抽点空整理一下构造函数和原型的机理. 我们都知道,在经典设计模式中我们最常用的就是工厂模式.构造函数模式.原型模式这几种,听起来‘模式’好像很高大上的样子,实际 ...

  3. JS中定义类的方法

    JS中定义类的方式有很多种: 1.工厂方式    function Car(){     var ocar = new Object;     ocar.color = "blue" ...

  4. JS中定义类的方法<转>

    转载地址:http://blog.csdn.net/sdlfx/article/details/1842218 PS(个人理解): 1) 类通过prototype定义的成员(方法或属性),是每个类对象 ...

  5. JavaScript面向对象编程(二)构造函数和类

    new关键字和构造函数 在文章JavaScript面向对象编程(一)原型与继承中讨论啦JavaScript中原型的概念,并且提到了new关键字和构造函数.利用new关键字构造对象的实例代码如下: // ...

  6. JS构造函数、对象工厂、原型模式

    1.对象创建的3中方法 1.1.对象字面量 var obj = { name: "mingzi", work: function () { console.log("wo ...

  7. koa 基础(十七)原生 JS 中的类、静态方法、继承

    1.app.js /** * 原生 JS 中的类.静态方法.继承 * es5中的类和静态方法 */ function Person(name, age) { // 构造函数里面的方法和属性 this. ...

  8. JS划重点——类和对象的不正经阐述

    JS划重点--类和对象的不正经阐述 /在JS 类里面函数也是一个对象,那么要创建一个对象就需要一个类,这个类可以由这个对牛逼的对象-函数来实现/ /首先是普罗大众都会的 工厂模式来创建一类/ func ...

  9. js常用工具类.

    一些js的工具类 复制代码 /** * Created by sevennight on 15-1-31. * js常用工具类 */ /** * 方法作用:[格式化时间] * 使用方法 * 示例: * ...

  10. JS构造函数的用法和JS原型

    $(function(){ var rec = new Rectangle(5, 10); //alert(rec.width + "*" + rec.height + " ...

随机推荐

  1. CommonLang3-使用介绍

    学习要带着目的,参照现实问题 本次目标: 了解 CommonsLang3 API 文档,找对路后以后开发直接查询 API 文档,摈弃盲目的百度 掌握基础的字符串.日期.数值等工具方法,初步替代手搓的工 ...

  2. DeepSeek崛起:程序员“饭碗”被抢,还是职业进化新起点?

    2025年伊始,Meta创始人扎克伯格的一则声明引发全球程序员热议:"AI将在今年达到中级工程师水平,逐步接管编程工作."与此同时,国产AI大模型DeepSeek的爆火,让一名8岁 ...

  3. vue element 动态增加表单并进行表单验证

    表单验证:需要注意的一点是: 普通表单验证单项依靠的是prop-而动态生成的表单要用:prop 书写的语法是:prop="'moreNotifyObject.' + index +'.not ...

  4. 动态代理到AOP

    动态代理 代理(proxy)是一种设计模式,通过了目标对象的另外访问方法,即通过代理对象访问目标对象.动态代理是再程序运行时动态地生成一个代理类代替原本的类.该类会拦截对目标对象的方法调用 为什么使用 ...

  5. QT5笔记:10. 容器类的迭代

    1. 这里指的是Java类型的迭代器,即使用方式和Java中一致 代器的使用例子(适用于可读可写迭代器) QList<QString>list;//声明容器类 list << ...

  6. Ai 系列 —— DeepSeek 初步介绍

    DeepSeek 初步使用介绍 背景 Ai 正在慢慢在改变我们的生活,比如老一辈可能已经在用豆包(字节跳动推出的AI聊天机器人) 前端开发,某些公司内部已在使用图生文(设计稿生成前端代码) 网上也有许 ...

  7. Python基础-Python操作word、面向对象

    今日概要: 第三方模块 -- word 面向对象 1 Word格式-第三方模块 自定义模块 内置模块 第三方模块 requests bs4 openpyxl python-docx 1.1 快速上手 ...

  8. 2024数证杯决赛团体赛wp

    2024数证杯决赛团体赛wp 容器密码:mW7@B!tRp*Xz46Y9#KFUV^J2&NqoHqTpLCE%8rvGW(AX#1k@YL3$M5!bWY*9HLFq7UZR6^T!XoVm ...

  9. Landsat遥感影像分幅条带介绍与矢量下载:WRS的Path与Row

      本文介绍Landsat系列卫星的分幅规则,并提供WRS的矢量文件下载.   WRS,即Worldwide Reference System,是Landsat系列卫星全球影像标记符号系统,用以区分全 ...

  10. 【ABAQUS脚本】后处理快速出图

    效果图: # -*- coding: utf-8 -*- # Do not delete the following import lines from abaqus import * from ab ...