重学前端
程劭非(winter)
前手机淘宝前端负责人
105347 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 57 讲
开篇词+学习路线+架构图 (3讲)
重学前端
15
15
1.0x
00:00/00:00
登录|注册

JavaScript对象:面向对象还是基于对象?

configurable
enumerable
setter
getter
configurable
enumerable
writable
value
特征
特征
原型体系与类的编程
类的方式
原型方式
访问器属性
数据属性
行为
状态
唯一标识性
JavaScript中的对象描述方式
对象在编程语言中的描述
对象在人类认知角度下的定义
对象在人类思维模式下的含义
对象的定义
探索JavaScript对象的机制
JavaScript对象的设计思路
理解JavaScript对象的思路
JavaScript对象的两类属性
对象的本质特征
什么是面向对象?
JavaScript中的“对象”概念
结语
JavaScript对象的特征
JavaScript是面向对象还是基于对象的?
JavaScript对象

该思维导图由 AI 生成,仅供参考

你好,我是 winter。
与其它的语言相比,JavaScript 中的“对象”总是显得不那么合群。
一些新人在学习 JavaScript 面向对象时,往往也会有疑惑:
为什么 JavaScript(直到 ES6)有对象的概念,但是却没有像其他的语言那样,有类的概念呢;
为什么在 JavaScript 对象里可以自由添加属性,而其他的语言却不能呢?
甚至,在一些争论中,有人强调:JavaScript 并非“面向对象的语言”,而是“基于对象的语言”。这个说法一度流传甚广,而事实上,我至今遇到的持有这一说法的人中,无一能够回答“如何定义面向对象和基于对象”这个问题。
实际上,基于对象和面向对象两个形容词都出现在了 JavaScript 标准的各个版本当中。
我们可以先看看 JavaScript 标准对基于对象的定义,这个定义的具体内容是:“语言和宿主的基础设施由对象来提供,并且 JavaScript 程序即是一系列互相通讯的对象集合”。
这里的意思根本不是表达弱化的面向对象的意思,反而是表达对象对于语言的重要性。
那么,在本篇文章中,我会尝试让你去理解面向对象和 JavaScript 中的面向对象究竟是什么。

什么是面向对象?

我们先来说说什么是对象,因为翻译的原因,中文语境下我们很难理解“对象”的真正含义。事实上,Object(对象)在英文中,是一切事物的总称,这和面向对象编程的抽象思维有互通之处。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

JavaScript对象的设计思路及特点 JavaScript对象的设计思路与传统基于类的面向对象编程有着明显的差异,本文从对象的基本理论出发,清晰地解释了JavaScript对象的概念和设计特点。文章首先介绍了JavaScript对象的两类属性,即数据属性和访问器属性,详细解释了它们的特征和使用方法。通过示例代码和API的介绍,读者可以深入了解JavaScript对象属性的定义和特征的改变。 进一步,文章从运行时的角度探讨了JavaScript对象的设计,强调了JavaScript对象具有高度的动态性,允许在运行时为对象添加属性,这使得JavaScript的对象系统设计特别而灵活。作者指出,要理解JavaScript对象,需要清空脑子中关于基于类的面向对象的知识,回归到对对象的朴素认知和面向对象的语言无关基础理论,才能真正理解JavaScript面向对象设计的思路。 总的来说,本文通过对JavaScript对象的特点和设计进行解释,帮助读者更好地理解JavaScript中的对象概念,以及JavaScript是基于对象的语言的特点。文章的深入剖析和清晰的逻辑结构,为读者提供了对JavaScript对象设计思路的全面了解,为进一步探索JavaScript对象的机制和原型系统奠定了基础。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《重学前端》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(101)

  • 最新
  • 精选
  • 如斯
    有个疑惑哈,讲道理symbolObj对象也是对象。也可以调用symbolObj.toString方法( symbolObj.toString() // "Symbol(a)" )。 但为什么会 symbolObj+'' 会报错呢。 Uncaught TypeError: Cannot convert a Symbol value to a string at <anonymous>:1:10

    作者回复: 这个问题问的很好,是这个东西在作怪: typeof Object(Symbol("a"))[Symbol.toPrimitive]()

    2019-02-13
    5
    27
  • 朋友
    getter setter实际应用的例子有哪些? vue的数据,视图双向绑定算吗?

    作者回复: vue2.0确实用到了这个。

    2019-02-22
    3
    7
  • Jackchoumine
    let obj = {}; // let _a="" Object.defineProperty(obj, "a", { // value: 123, // writable:true, configurable: true, // get: function() { // return "这是访问器属性"; // } set: function(newValue) { console.log(newValue); this.a = newValue; } }); Object.defineProperty(obj, "hi", { value: function() { console.log("Hello"); }, configurable: false }); console.log(obj); console.log("before", obj.a); obj.a = "aaaa"; 为甚么这样报错了:xJAjOnELvGnk:55 Uncaught RangeError: Maximum call stack size exceeded.

    作者回复: this.a = newValue; 这句递归调用了setter

    2019-09-13
    3
  • cnzhujie
    个人理解:面向对象就是万物皆为类,离开了类就活不了;比如Java里面,就算只写个main函数也要用class包裹起来。而基于对象说的是这门语言可以使用类和对象,但不使用类和对象也照样玩的转,比如c++、php、js。

    作者回复: 不是的,基于类的面相对象只是一个派系。

    2019-04-04
    6
    2
  • 啊哈小新
    OC的面向对象思想简直就是反人类。。。一种基于消息发送的smalltalk风格。。。然鹅OC是比C++还早的面向对象语言。。。

    作者回复: smalltalk是面向对象的鼻祖,面相对象的概念到今天已经有很大变化。 你可以把旧时代和新时代的OOP看做不同的东西。

    2019-09-25
  • 胡琦
    配图是照猫画虎? Object. defineProperty是不是有兼容性呢?

    作者回复: 现代浏览器兼容性已经很好了。

    2019-02-18
  • 恋着歌
    数据属性、访问器属性,也叫数据描述符、存取描述符,只能选择一种描述符,https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

    作者回复: 错了,属性是属性,描述符是描述符。 描述符是用来描述属性的JavaScript对象型数据。

    2019-02-13
  • 风清不扬
    php 是世界上最好的編程語言
    2019-01-29
    10
    146
  • 37°C^boy
    这篇讲的思路太好了,追本溯源,娓娓道来。在这里不光能学到知识活着重温知识,还有关于学习和讲授的方法lun
    2019-01-29
    1
    104
  • hhk
    关键点在于是否可以在运行时动态改变对象 结合文章通篇看下来,觉得 JS 的 OO 和他基于类的 OO 不同之处,在于 JS 可以在运行时修改对象,而 class based 的类只能预先全部定义好,我们并不能在运行时动态修改类。在我理解来说,条条大路通罗马,面向对象是罗马,class based 是一条路,prototype based 是另一条路。而且 Symbol 的出现,暴露出了许多内置接口,让 JS 又在这条路上走了更远一些。(以前上学背面向对象的三个特征,封装,继承,多态,现在看一下突然觉得很对。。。 像我这种年轻一点的前端,很可能就只是相对熟悉 JS 而已,对于其他语言更多都是道听途说,计算机基础也比较薄弱,所以用来比较其实比较难。 只知道 class based 的大概有 Java,C++, C#, Python 另外,好奇 Symbol 是怎么实现的,希望老师以后能大概讲讲啦。暂时只想到这些,其他的还在消化
    2019-01-30
    3
    58
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部