Javascript原型
本文为了解决以下问题:
- Javascript中的对象
- 原型中所涉及的概念(
__proto__
,prototype
,constructor
) - 构造函数原型链
- 完整对象59
- 原型链
- 数组原型链
- 总结
Javascript中的对象
对象是若干属性的集合,在Javascript中,万物皆对象,方法(Function)是对象,方法的原型(Function.prototype)是对象
原型中所涉及的概念
原型:原型是一个对象,其他对象可以通过它实现继承。它为构造函数设置一个prototype属性。prototype属性包含一个对象,所有实例对象需要共享的属性和方法,都放在这个对象里面;那些不需要共享的属性和方法,就放在构造函数里面
原型对象(prototype):这个对象包含所有实例共享的属性和方法。
proto属性:所有对象都有属性proto,指向该对象的构造函数的原型对象。
1 | function Person(name){ |
Function:方法(Function)是个特殊的对象,除了和其他对象一样有proto属性之外,还有自己特有的属性——原型属性(prototype)
prototype属性:这个属性是一个指针,指向一个对象(我们叫做原型对象),这个对象的用途就是包含所有实例共享的属性和方法。
1 | function Animal (color) { |
constructor属性:原型对象有一个属性,叫做constructor,这个属性包含了一个指针,指回原构造函数(它本身)
1 | console.log(Function.prototype.constructor === Function); // true |
Tips
关于proto__
1 . 任何对象都拥有 __proto__
(隐式原型) 属性, 一般指向他们的构造函数的原型 (prototype) .
1 | var a = new Array () |
2、所有方法(Function)的__proto__
都指向Function.prototype
1 | function XXXXX (color) { |
3 . 原型链的顶端是Object.prototype,其 __proto__
为 null
1 | console.log(Object.prototype.__proto__ === null); // true |
4 . 所有函数都拥有prototype (显式原型)属性,除Object.prototype.proto === null外,其他任何函数的 prototype.proto 都指向 Object.prototype
1 | console.log(XXXXX.prototype.__proto__ === Object.prototype); // true |
关于prototype
只有方法(Function)才有prototype属性
关于constructor
只有原型对象才constructor属性,指回原构造函数
1 | console.log(Array.prototype.constructor === Array); // true |
构造函数原型图
1 | function Animal (color) { |
当我们创建一个函数时原型如下:
1 | //补充 |
完整对象原型链
1 | var obj = { name: '陈二狗' } |
数组原型链
1 | var arr = ['第一个数','第二个数','第三个数'] |
总结
现在就对上面的例子中分析得到的结果/关系进行图解,相信这张图可以让你豁然开朗。
对于上图的总结如下看具体代码:
1 | function test () { |
完结