【Web前端问题】javascript一切都是对象的问题。
为什么像Array,Number,Boolean,String等,他们为什么既是构造函数,又是对象呢?
回答:
补一张经典的图吧
回答:
给你推点公式
javascript
var a = new Array(); // 生成一个Array的实例
a.__proto__ === Array.prototype; //true
总结下就是实例的原型(__proto__
是浏览器里的实现,标准是使用的[[proto]]
表示)指向其构造函数的prototype
对象
然后我们验证下
javascript
Array.__proto__ === Function.prototype; //true
String.__proto__ === Function.prototype; //true
...
这说明Array,String,Boolean,Number都是Function的实例,所以这些都是函数(如果函数能生成实例,则该函数也叫构造函数)实例。
不过瘾?再来便是,如果xxx是函数,则
javascript
Function.prototype.__proto__ === Object.prototype; //true
xxx.__proto__ === Function.prototype;
这说明函数本身也是Object的实例(理由就是一切均是对象),你可能会问Array是Function的实例,不是Object的实例啊。确实如此,但不准确,只能说Array不是Object的直接实例,最直接证明了这一点的方式便是
Array.__proto__ === Object.prototype; //false
不是直接自然便是间接咯,对的,就是间接的。那是如何间接的呢?
Array.__proto__.__proto__ === Object.prototype; //true
对,就是这么的‘间接’(此处我该说间接好呢还是说直接好呢?还是说就是这么的直接的间接?)。所以一切均是对象仍然成立。
爱动脑筋的你肯定发现啦!是不是想尝试Array.__proto__.__proto__.__proto__...
呢?
尽管尝试好了,当你碰过壁之后就体会更深,这是好事。
言归正传
你不能这么一直下去的,因为金字塔一定有最顶端,而Object.prototype.__proto__
就是最顶端
Object.prototype.__proto__ === null; //true
这是一切均是对象的另一说法(你不可能比对象的原型更高,换句话说就是所有的实例必须在Object之下)
聪明的你可能从上面的__proto__.__proto__...
中发现了什么端倪了吧?这看着怎么像一条链条啊!确实是,要不就给他取个名字吧,就叫原型链吧?你觉得这个名字怎么样?
说得比较杂,这和我不善于表达密切相关(真的吗?确定不是这知识点太难描述?),不过希望对你有帮助。
回答:
因为函数就是对象.
构造函数既然是函数, 那么构造函数也是对象
js
function a(){}
true === a instanceof Object
'function' === typeof Array
'function' === typeof Number
'function' === typeof Boolean
'function' === typeof String
true === Array instanceof Object
true === Number instanceof Object
true === Boolean instanceof Object
true === String instanceof Object
以上是 【Web前端问题】javascript一切都是对象的问题。 的全部内容, 来源链接: utcz.com/a/139734.html