纵横研究院前端基础技术专题社区

Javascript-原型与原型链

2019-05-05  本文已影响0人  YS909090

简单介绍

JavaScript 每个对象都拥有一个原型对象,对象以其原型为模板从原型中继承方法和属性;

原型对象也可能拥有原型,并从中继承方法和属性;一层一层、以此类推,而由这种关系组成的一条链,我们常称为原型链。

准确地说,这些属性和方法定义在 Object 的构造器函数 constructor 的prototype属性上,而非对象实例本身。

原型

在javascript中,函数可以有属性。并且每个函数都有一个特殊的属性[[Prototype]]叫作原型。

-所有的引用类型(函数,数组,对象),都有一个__proto__的属性, 我们习惯称之为隐式原型;(__proto__并不是规范属性,只是部分浏览器实现了此属性)

-所有的函数都具有一个prototype的属性,我们习惯称之为显式原型;

-拥有prototype属性的对象,在定义函数时就被创建(原型对象)。


function Foo() {}

const foo = new Foo()

foo.__proto__ === Foo.prototype // true

原型链

原型链就是原型的集合,一级一级地往上查找,直到 Object 的原型对象的原型(null);


function Foo() {}

const foo = new Foo()

Object.prototype.test = function() {}

console.log(foo.test) // ƒ () {}

// 此时访问 foo 的 test 方法的历程是

foo.__proto__ === Foo.prototype // true

Foo.prototype.__proto__ === Object.prototype // true

foo.test === Object.prototype.test

Foo.__proto__ === Function.prototype // true

Function.prototype.__proto__ === Object.prototype // true

Object.prototype.__proto__ === null // true

Function.__proto__ === Function.prototype // true

从上面我们可以看出,函数对象的 __proto__ 指向 Function.prototype

与此相同的还有:


Number.__proto__ === Function.prototype  // true

Number.constructor === Function //true

Boolean.__proto__ === Function.prototype // true

Boolean.constructor === Function //true

String.__proto__ === Function.prototype  // true

String.constructor === Function //true

Object.__proto__ === Function.prototype  // true

Object.constructor === Function // true

Function.__proto__ === Function.prototype // true

Function.constructor === Function //true

Array.__proto__ === Function.prototype  // true

Array.constructor === Function //true

RegExp.__proto__ === Function.prototype  // true

RegExp.constructor === Function //true

Error.__proto__ === Function.prototype  // true

Error.constructor === Function //true

Date.__proto__ === Function.prototype    // true

Date.constructor === Function //true

上一篇 下一篇

猜你喜欢

热点阅读