JS里公用属性(原型与原型链)
一、什么是原型?
在javascript中,全局函数Number、String、Boolean、Object等,都有toSting()、valueOf()等方法,倘若每个函数都独自定义这些相同的属性和方法,势必对内存造成极大的浪费。因此这些相同的属性和方法,都被集合到一起,对象可通过__proto__属性访问(公用的属性全部存在__proto__里)这些共用属性prototype,如图:
![](https://img.haomeiwen.com/i14754611/5f5baf39af901c28.png)
![](https://img.haomeiwen.com/i14754611/d0c8c07e930d5408.png)
var n = new Number(1)
var obj = {}
obj.__proto__ === Object.prototype //true obj共用Object的属性
n.__proto__ === Number.prototype //true,n共用Number的属性
Number.prototype.__proto__===Object.prototype//true,Number.prototype 本身也是个对象,共用Object的属性
var s = new String('hi')
s.__proto__ === String.prototype //true
一般:object对象公有的属性有:toString valueOf
Number公有属性有:toFixed toExponential toString() //可接16进制
公有属性就是原型:prototype
(1)object的公有属性
![](https://img.haomeiwen.com/i14754611/1273e5c596edc766.png)
Var o1 = {}
O1.__proto__ = object.prototype
(2)number的公用属性
![](https://img.haomeiwen.com/i14754611/3776071ceb89014b.png)
Var n1 = new number(1)
n1.__proto__ = number.prototype
n1.__proto__.__proto__ = object.prototype // n1共有属性的共有属性
(3)String / boolean的公用属性
![](https://img.haomeiwen.com/i14754611/db3cdfb9662dce2d.png)
Var s1 = new String(‘1’)
s1.__proto__ = String.prototype
s1共有属性的共有属性:s1.__proto__.__proto__ = object.prototype
Var b1 = new Boolean(ture)
b1.__proto__ = Boolean.prototype
b1.__proto__.__proto__ = object.prototype // b1共有属性的共有属性
语法:(1) var 对象 = new 函数()
(2)对象.__proto__ ===函数.prototype
Number.__proto__ === Function.prototype // true,因为 Number 是 Function 的实例
Object.__proto__ === Function.prototype // true,因为 Object 是 Function 的实例
Function.__proto__ === Function.prototye // true,因为 Function 是 Function 的实例!
Object.__proto__ ===Function.__proto__ // true,因为 Function.__proto__ === Function.prototye
![](https://img.haomeiwen.com/i14754611/f78443fecd07a956.png)
什么是原型链?
每个实例对象(object )都有一个私有属性(称之为__proto__)指向它的原型对象(prototype)。该原型对象也有一个自己的原型对象(proto) ,层层向上直到一个对象的原型对象为 null。这种链式结构,称之为原型链。