原 型:相同对象的共有属性也称做原型函数
原型链:中全部的对象都是由它的原型对象继承而来。而原型对象自身也是一个对象,它也有本身的原型对象,这样层层上溯,就造成了一个相似链表的结构,这就是原型链spa
在JS中,不一样类型对象都有各自相同类型共有的属性,也有所有对象共有的属性,若是每一个对象的属性都单独出来,会很是浪费资源,prototype
var a = new String('a'); var b = new Number(1); var c = new Boolean(true); //能够发现,无论是字符串仍是数值仍是布尔,它们都有toString()属性 a.toString ƒ toString() { [native code] } b.toString ƒ toString() { [native code] } c.toString ƒ toString() { [native code] }
因此JS将公共的属性单独出来【如所有对象共用属性valueOf() ,toString()】,JS经过__proto__ 来指向每一个类型对象的公共属性。好比,有五个string对象五个number对象,每一个对象的值都是不一样的,但对象类型都是同样的。code
var a = new Number(1) var b = new Number(2) //虽然变量a和b的值不一样,可是它们共有的属性都是__proto__: Number console.log(a) Number {1} __proto__: Number [[PrimitiveValue]]: 1 console.log(b) Number {2} __proto__: Number [[PrimitiveValue]]: 2
string对象和number对象都有本身私有属性(指相同对象类型的私有属性),每一个对象的__proto__都指向本身相同对象类型的私有属性,相同对象类型的私有属性也有本身的__proto__,它指向的是所有对象共有的属性。__proto__: Number下面的__proto__又指向了所有对象共有的属性。对象
所有对象共有的属性,没有__proto__属性,它指向的是null,经过下面截图看出普通的object对象__proto__下的属性已经没有__proto__指到其余地方了。blog
说的直白点就是,全部原型链的__proto__属性,最终都指向的是object对象的__proto__而object对象的__proto__指向的是null。继承
var 对象 = new 函数() 对象.__proto__ === 对象的构造函数.prototype // 推论 var number = new Number() number.__proto__ = Number.prototype var object = new Object() object.__proto__ = Object.prototype var function = new Function() function.__proto__ = Function.prototype // 另外,全部函数都是由 Function 构造出来的,因此 Number.__proto__ = Function.prototype // 由于 Number 是函数,是 Function 的实例 Object.__proto__ = Function.prototype // 由于 Object 是函数,是 Function 的实例 Function.__proto__ == Function.prototye // 由于 Function 是函数,是 Function 的实例!