乐趣区

原型与原型链学习笔记

原 型:相同对象的共有属性也称作原型

原型链:中所有的对象都是由它的原型对象继承而来。而原型对象自身也是一个对象,它也有自己的原型对象,这样层层上溯,就形成了一个类似链表的结构,这就是原型链

在 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 的实例!
退出移动版