search

Home  >  Q&A  >  body text

javascript一切都是对象的问题。

为什么像Array,Number,Boolean,String等,他们为什么既是构造函数,又是对象呢?

ringa_leeringa_lee2894 days ago300

reply all(3)I'll reply

  • 高洛峰

    高洛峰2017-04-10 15:29:03

    补一张经典的图吧

    reply
    0
  • 迷茫

    迷茫2017-04-10 15:29:03

    给你推点公式

    javascriptvar a = new Array(); // 生成一个Array的实例
    a.__proto__ === Array.prototype; //true
    

    总结下就是实例的原型(__proto__是浏览器里的实现,标准是使用的[[proto]]表示)指向其构造函数的prototype对象
    然后我们验证下

    javascriptArray.__proto__ === Function.prototype; //true
    String.__proto__ === Function.prototype; //true
    ...
    

    这说明Array,String,Boolean,Number都是Function的实例,所以这些都是函数(如果函数能生成实例,则该函数也叫构造函数)实例。
    不过瘾?再来便是,如果xxx是函数,则

    javascriptFunction.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__...中发现了什么端倪了吧?这看着怎么像一条链条啊!确实是,要不就给他取个名字吧,就叫原型链吧?你觉得这个名字怎么样?

    说得比较杂,这和我不善于表达密切相关(真的吗?确定不是这知识点太难描述?),不过希望对你有帮助。

    reply
    0
  • 黄舟

    黄舟2017-04-10 15:29:03

    因为函数就是对象.
    构造函数既然是函数, 那么构造函数也是对象

    jsfunction 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
    

    reply
    0
  • Cancelreply