原型与原型链学习笔记

原 型:相同对象的共有属性也称做原型函数

原型链:中全部的对象都是由它的原型对象继承而来。而原型对象自身也是一个对象,它也有本身的原型对象,这样层层上溯,就造成了一个相似链表的结构,这就是原型链
图片描述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 的实例!
相关文章
相关标签/搜索