原 型:相同对象的共有属性也称作原型
原型链:中所有的对象都是由它的原型对象继承而来。而原型对象自身也是一个对象,它也有自己的原型对象,这样层层上溯,就形成了一个类似链表的结构,这就是原型链
在JS中,不同类型对象都有各自相同类型共有的属性,也有全部对象共有的属性,如果每个对象的属性都单独出来,会非常浪费资源,
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对象,每个对象的值都是不同的,但对象类型都是一样的。
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__指到其他地方了。
说的直白点就是,所有原型链的__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 的实例!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。