自学JavascriptHathras常常被__proto__ 与 prototype 这三个特性帕吕奥了, 因此先在此列举常用的各对准情形:
var num = 1 num.__proto__ === Number.prototype
num.__proto__.__proto__ === Object.prototype
num.__proto__.constructor === Number Number.prototype.__proto__ === Object.prototype
Number.prototype.constructor === Number
var fn = function(){}
fn.__proto__ === Function.prototype
fn.__proto__.__proto__ === Object.prototype
fn.__proto__.constructor === Function Function.prototype.__proto__ === Object.prototype
Function.prototype.constructor === Function
var array = []
array.__proto__ === Array.prototype
array.__proto__.__proto__ === Object.prototype
array.__proto__.constructor === Array Array.prototype.__proto__ === Object.prototype
Array.prototype.constructor === Array
var bool = true bool.__proto__ === Boolean.prototype
bool.__proto__.__proto__ === Object.prototype
bool.__proto__.constructor === Boolean/**/ Boolean.prototype.__proto__ === Object.prototype
Boolean.prototype.constructor === Boolean
var str = “String” str.__proto__ === String.prototype
str.__proto__.__proto__ === Object.prototype
str.__proto__.constructor === String String.prototype.__proto__ === Object.prototype
String.prototype.constructor === String
var object = {}
object.__proto__ === Object.prototype
object.__proto__.__proto__ === null object.__proto__.constructor === Object Object.prototype.__proto__ === null Object.prototype.constructor === Object
运行都为true,从以上代码一步步讲解实例,蓝本,蓝本链,构造函数,构造函数特性,new指令 及 js一切皆对象的误解
构造函数
JS中以上代码会用到的几个构造函数分别是Function,Number,Boolean,String,Object
而这些构造函数都是由 Function构造出来的, 因此Function.__proto__ === Function.prototype // 为 true
Array.__proto__ === Function.prototype // 为 true
Object.__proto__ === Function.prototype // 为 true
Number.__proto__ === Function.prototype
Boolean.__proto__ === Function.prototype
String.__proto__ === Function.prototype
以上第一句代码 var num = 1 其实应该这样写 var num = new Number(1) , 那么为什么 直接赋值num还是可以使用很多Number的方法呢因为JS在使用num的时候会创建一个临时的Number(1)给num ,然后num就可以正常使用Number的方法,本质上num还是基础数据类型,而不是混合数据类型的对象形式那么为什么要使用new呢当一个函数New的时候 会执行以下几步//使用new 会有以下四个步骤 function fn(){
1. 创建一个临时对象
var temp = {}
2. 临时对象__proto__ = fn.蓝本
temp.__proto__ = fn.prototype
3. 返回这个临时对象
return temp
}
fn.prototype = {
constructor : fn
}
那么执行完 var num = new Number(1) 后 num就是一个对象了, 而这个对象里面有一个__proto__的特性 。实例
因此实例就是: 执行构造函数后得到的这个对象
蓝本
而蓝本就是: 实例__proto__特性对准的 该函数的 prototype特性也是一个对象
构造函数特性
构造函数特性constructor对准该构造函数本身
蓝本链
而 蓝本链就是 num.__proto__.__proto__.__proto__ === null 这条链所对应的值
读取特性
当我们读取特性时, 从实例对象的特性开始找,如果实例特性中没有需要的特性,就去蓝本中找,如果该蓝本中还是没有,又会继续往下一层蓝本中找,直到顶层为止。 num.__proto__.__proto__.__proto__ === null只想null的时候