1String按道理是一个构造函数的名称,但为什么也具有一些属性和方法?
这是之前在学习String的包装类时,遇见一个问题,
这是因为任何函数实际上都是Function类的一个实例,所以f.__proto === Function.prototype,返回的是true,如下
Function.prototype作为一个对象又是Object类的一个实例,所以Function.prototype.__proto__ === Object.prototype,,如下
也可以描述为,Fun.__proto__.__proto__ === Object.prototype,如下
所以,Fun必然会存在一些从原型链上继承的方法和属性
当然String也是如此,如下
2关于Array()与 new Array() 效果相同的问题?
描述:作为构造函数,按道理需要在前边加new才能构造出实例对象,但是对于Array、Object这些构造函数却比较特殊,有没有new却都能返回一个实例对象。除此之外,String、Number、Boolean也是如此
在网上找到了一些解答:
https://segmentfault.com/q/1010000008676899,第一个被采纳的回答,利用说内置的对象的构造函数中有判断是否带new 的判断,即
this instanceof Object的判断,
如果没写new的话,this通常指向的是window,肯定不是Point的实例。所以进入if里边,重新生成一个实例。
实际上,大部分的内置对象都具有如此的特性,《JavaScript高级程序设计》p130的一句话“开发人员不必显示地实例化内置对象,因为它们已经实例化了。”我猜这句话说明的就是这种特性。
大部分,当然也有特殊,
- Date对象就比较特殊,
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date,按照这上边所说的,
实际上确实如此。
- Math对象也比较特殊
实际山,Math是不允许实例化,如下