由一个问题引发关于对象和对象子类型的思考

简介: 由一个问题引发关于对象和对象子类型的思考

问题:

如题


var obj=new Object();
Object.prototype.toString.call(obj);// "[object Object]"
var arr=new Array();
Object.prototype.toString.call(arr);// "[object Array]"

如此类推,输出的"[object Object]"这些字符串,第一个object代表的是什么?第二个Object代表的又是什么?开头还是大写。


答案:

核心:对象对象子类型


先看一段MDN解释:


/

If this method is not overridden in a custom object, toString() returns "[object type]", where type is the object type.
var o = new Object();
o.toString(); // returns [object Object]

https://developer.mozilla.org...


第一个object代表custom object(对象)。

第二个Object代表type(对象子类型)。


那么问题来了,什么是custom object?


不严谨的说,Javascript中的所有,都是由custom object(对象)衍生出来的type(对象子类型).

JavaScript包括DOM,BOM和EcmaScript。
DOM的div,本质上也是一个custom object,type是HTMLDivElement。
BOM的navigator,本质上也是一个custom object,type是Navigator。
EcmaScript的arguments,本质上也是一个custom object,type是Arguments。


再说说常见的简单和复杂数据类型


/

String,Number,Boolean,null,undefined
Array,Object,Function,RegExp,Data,Math...

用toString()时,同样也会返回

[object String] [object Number] [object Boolean]......

不想写了,都一样,后面都是各自的type(对象子类型)。


至于为什么Object.prototype.toString.call("foo")同样会返回[obejct String],因为"foo"和String("foo")是等价的,注意,此处没有new。


这时候可能比较晕了,那么再来想想什么是简单数据类型,什么是复杂数据类型。

我的理解是,所有的数据类型都是由custom object(对象)衍生出来的,所以他们都是对type(对象子类型)。


只不过简单数据类型没有继承那些原型链上的方法,这样更加轻量;若继承的话,需要使用new操作符,就彻底成一个复杂数据类型了。


几乎所有的对象子类型都会继承Obejct,不过我想Object.create(null)是所有其他对象子类型的最原始状态


至于Object是怎么来的,我想这是个迷了,等后面我知道了再来补充答案

也不知道对不对,反正我把所有已知都联系起来了,轻喷

相关文章
|
3天前
|
存储 Java 编译器
类、对象、方法
摘要: 本文介绍了面向对象编程的概念,以京东购买手机为例,展示了如何通过分类和参数选择商品,强调软件与现实生活的对应关系。柯南三步走揭示了京东如何通过搜索和筛选帮助用户找到所需商品,而这一切背后的编程思想即为面向对象编程。面向对象编程涉及抽象、自定义类型和实例化对象等步骤,其中自定义类型(如Java中的类)用于封装现实生活中的复杂数据。文章还讲解了如何定义类、实例化对象以及访问权限修饰符、构造方法、this关键字、方法的使用,强调了方法参数和返回值在不同数据类型上的处理差异。整个讨论旨在阐明Java中面向对象编程的基本原理和实践应用。
15 5
|
1月前
|
存储 C#
C#对象和类
C#对象和类
15 0
|
1月前
|
存储 C++
C++对象和类
C++对象和类
15 0
|
4月前
|
存储 Java 编译器
第 4 章 对象与类(下)
第 4 章 对象与类
107 0
|
4月前
|
存储 算法 Java
第 4 章 对象与类(上)
第 4 章 对象与类
63 0
|
11月前
|
编译器 C语言 C++
C++ 类 & 对象
【摘要】 C++ 类 & 对象C++ 在 C 语言的基础上增加了面向对象编程,C++ 支持面向对象程序设计。类是 C++ 的核心特性,通常被称为用户定义的类型。类用于指定对象的形式,它包含了数据表示法和用于处理数据的方法。类中的数据和方法称为类的成员。函数在一个类中被称为类的成员。C++ 类定义定义一个类,本质上是定义一个数据类型的蓝图。这实际上并没有定义任何数据,但它定义了类的名称意味着什么,也就是...
|
JavaScript 前端开发
证明函数是对象的特殊子类型和函数的对象属性
证明函数是对象的特殊子类型和函数的对象属性
|
JavaScript 前端开发 安全
30、对象的继承
JavaScript 通过构造函数生成新对象,因此构造函数可以视为对象的模板。
106 0