简单介绍
JavaScript
每个对象都拥有一个原型对象,对象以其原型为模板从原型中继承方法和属性;
原型对象也可能拥有原型,并从中继承方法和属性;一层一层、以此类推,而由这种关系组成的一条链,我们常称为原型链。
准确地说,这些属性和方法定义在
Object
的构造器函数constructor
的prototype属性上,而非对象实例本身。
原型
在javascript中,函数可以有属性。并且每个函数都有一个特殊的属性[[Prototype]]
叫作原型。
-所有的引用类型(函数,数组,对象),都有一个__proto__
的属性, 我们习惯称之为隐式原型;(__proto__
并不是规范属性,只是部分浏览器实现了此属性)
-所有的函数都具有一个prototype
的属性,我们习惯称之为显式原型;
- 所有的引用类型(函数,数组,对象),其
__proto__
属性都指向其构造函数的prototype
(obj.__proto__ === Object.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