17 | Object.setPrototypeOf(x, null):连Brendan Eich都认错,但null值还活着
该思维导图由 AI 生成,仅供参考
null 值
- 深入了解
- 翻译
- 解释
- 总结
JavaScript中的null值并非BUG设计,而是一个合理的设计。在JavaScript中,null值是一个对象类型,用于表达一个对象不存在的情况,即“非对象”。这使得JavaScript存在两套类型系统,即值类型和对象类型,从而产生了所谓的值类型的包装类和对象的`valueOf()`原型方法。同时,Null类型也是一个类型,且null是它唯一的值。在JavaScript中,null值是一个原始值,是所有对象类型的“元类型”,即一个原子。原子对象是“对象”的最原始形态,其特点是原型为null,代表关联数组的最基础抽象数据结构。JavaScript的对象有且仅有13个原子行为,这使得代理对象能够无缝且全面地代理任何对象。文章还提到了关于原子对象的方法以及代理对象的陷阱方法。总的来说,本文介绍了JavaScript中null值的设计及其在类型系统中的重要地位,以及原子对象和代理对象的相关知识。文章还展望了下一讲将会讨论“动态语言”,为读者提供了对JavaScript语言设计的初步了解。
《JavaScript 核心原理解析》,新⼈⾸单¥59
全部留言(10)
- 最新
- 精选
- 行问多看看技术在历史上是怎么出现的,怎么解决问题的,溯源这种“原型链”让我大呼过瘾。一路学习下来,有完全不懂,有闻所未闻,有懵逼,有茅塞顿开等。今天的这一讲,让我理解了 "null" 在实际开发中的合理运用。
作者回复: ^^ 多谢多谢。能讲得对大家有用就好。:)
2019-12-2312 - 程序员劝退师这是除了加餐课外,我能最快理解的一节课,嗯一定是我进步了😁
作者回复: 一定是进步了+1 😃
2019-12-263 - 小炭“原子对象” 这一概念只有Javascript才会有吗,在C和C ++的标准术语也有这个“原子对象” 的定义。不知道他们之间有什么区别,或者这个定义的源头来自哪里?
作者回复: 从ecmascript来说,也没有原子对象这个概念。我之所以提到这个,是因为“原子性”这个概念可以用在这里,表明这种对象是“原子性的”。如果你有兴趣读一下《JavaScript语言精髓与编程实践(第三版)》,会对这个概念,以及由此带来的一个类型体系有更深的了解。 我最早看到这个概念是在李战的《悟透Delphi》这本书中,我记得后来这本书并没有出版。大概是在那个时间点前后,程序员圈子里兴起过一阵关于“语言原子性”的讨论。 又,这已经是快20年前的事情了。
2020-11-102 - 蛋黄酱> 如果 MyClass.prototype 指向 null,而 super 指向一个有效的父类,其结果如何呢 这配上示例代码,意思是说setPrototypeOf虽然字面上的意思是改变prototype但本质上只改变了super执行的对象? 我觉得不对吧?
作者回复: 一共影响三个东西,一个是MyClass和MyClass.prototype中所有方法的super指向,二个是使MyClass的创建过程与super(例如这里的Date)动态绑定起来,三个是MyClass自己的类方法(静态方法)。只不过第三个没有表现在示例中。 这里用setPrototypeOf()改的是MyClass的原型,而不是MyClass.prototype的原型。
2020-03-1522 - 卡尔老师,我记得有一本书里说,undefined派生于null。老师这句话怎么去理解,他俩到底是什么关系?有什么区别?
作者回复: 那本书一定写错了。 这两者没有直接的关系。在ECMA的概念上,二者都是原始值(primitive values);在JavaScript的概念上,null是对象,而undefined是值(类型)的数据。无论是哪一种理解,二者都没有派生或类属的关系。 关于二者的更多区别,还是建议看一下绿皮书,专门有一节来讨论这个问题。
2021-01-12 - HoSaltclass A {} class B extends A {} B.__proto__ === A // true B.__proto__.__proto__ === Function.prototype // true class MyClass extends null {} MyClass.__proto__ === Function.prototype // true 老师继承自null的类的原型链直接指向了Function.prototype,而其它的是在中间加了一层,这是一种特殊处理?
作者回复: 这是因为MyClass本来就是一个函数,它的原型(缺省)指向Function.prototype是正常的。 X.prototype不应当是一个null值——对于JS来说,置null值是“无效值”。当这个值无效时(例如null/undefined),等义于它使用Object.prototype。你试着找一个其它对象来试一下就知道了。 X.prototype存在无效值的原因是:缺省情况下,这个属性是可写的。因为“对象属性”在历史中可以写成任何值,所以历史上它就没有“属性类型”这样的限制。这是一个继承历史而来的设计。
2020-05-25 - 新哥是时候讲一下 prototype和__proto__了😄2020-06-21
- t86老师的功力真的是深,佩服2020-01-16
- 水木年华老师讲的真好,有体会有收获😄2020-01-05
- 许童童老师讲得太好了。2019-12-24