一、公用属性(原型)
公用属性意义:不重复声明一样的属性,不浪费内存。
- 理解公用属性
(1)以对象为例:var o = new Object()
,对象只存自己的 key(属性),共有的属性不存,而是用__proto__
去指向共有属性。内存图展示:
Object 公用属性内存图 代码展示: Object 共用属性举例
(2)以 Number 为例:var n = new Number(1)
,以下几个属性是只有 Number 类才共有的属性:
toFixed
:确定有几位小数
toExponential
:科学计数法
toString(16)
:Number 的 toString 接受参数(进制),与Object 的不同
内存图展示:
Number 公用属性内存图 代码展示: Number 公用属性举例(3)其他类也是这样,先通过
__proto__
先指向自己这一类的共有属性,再通过__proto__
指向 Object 的共有属性,形成一条原型链,如下图所示:原型
- 共用属性放在哪
-
String.prototype
是 String 的公用属性的引用(一直存在)
s.__proto__
是 String 的公用属性的引用(使用这个属性) - 公用属性也是哈希,不被引用时会被垃圾回收,所以即使不写代码,也一直是被引用的状态,prototype 一直存在。 共有属性引用
二、__proto__
和 prototype
- 语法形式
var 对象 = new 函数()
// 例:var n = new Number()
对象.__proto__ === 函数.prototype
//例: n.__proto__ === Number.prototype
-
区别:
__proto__
是对象的属性,prototype
是函数的属性;
但二者指向同一个对象,存的地址是相同的。 - 易错题
'1'.__proto__
是什么?
因为基本类型是没有属性的,'1'
会临时变成一个 String 对象(new String()
),所以指向指向函数的属性String.prototype
.
- 推论
由对象.__proto__ === 函数.prototype
知,对象的__proto__
指向构造它的函数的prototype
,我们由此推论出:
- 函数的 prototype 是个简单的对象,是由 Object 构造出来的:
函数.prototype.__proto__ === Object.prototype
- 函数作为一个对象,是由 Function 构造出来的:
函数.__proto__ === Function.prototype
- function 优先是个函数(也是对象),函数是由 Function 构造出来的:
Function.__proto__ === Function.prototype
- Function 作为一个函数,它有
prototype
:
Function.protoype.__proto__ === Object.prototype
- 另外:
Function 是 Object 的构造函数,所以:
Object.__proto__ === Function.prototype
Object 的公用属性是所有函数公用属性的根节点,它指向 null.
Object.prototype.__proto__ === null
网友评论