JS的原型理解
js的原型系统,主要包含以下三个基本元素
一、属性
- prototype
- __ proto __
- constructor
二、理解那三个概念的基础
1. js函数对象
有不同类型的函数对象,例如下面的
function Function { [native code }
| [Function:Function]
function Object { [native code }
| [Function:Object]
function Array { [native code }
| [Function:Array]
function String { [native code }
| [Function:String]
//基本包装对象
function Number { [native code }
| [Function:Nuber]
function Boolean { [native code }
| [Function:Boolean]
function Person { [native code }
| [Function:Person]
//自定义的构造函数
2. 以上函数对象的初始化默认值
[Function]
{}
[]
[String:'' ]
[Number:0 ]
[Boolean:false ]
Person {}
三、原则
1. 只有函数对象有prototype
属性,并且函数对象的prptotype属性的返回值是二(2)里面定义的初始化值
2. 变量的__ proto __属性返回的是它的构造函数的原型对象
3. 变量的constructor属性返回的是它的构造函数,(也就是二(1)里面的)
要牢记上述三条原则,基本上贯穿了整个原型系统
四、示例
1. constructor
constructor就是返回对象的构造函数,一定是函数,只是划分了类型
// 因为二(1)讲到Array, Object,Function,Number。。。都是函数对象,所以它们的构造函数都是一样的Function
Array.constructor = [Function:Function]
Object.constructor = [Function:Function]
Function.constructor = [Function:Function]
Number.constructor = [Function:Function]
Person.constructor = [Function:Function]
[1,2,3].constructor = [Function:Array]
数组构造函数
'123'.constructor = [Function:String]
字符串构造函数
1.constructor = [Function:Number]
false.constructor = [Function:Boolean]
p1.constructor = [Function:Person]
2. prototype
prototype返回的是函数对象的类型标识,只有函数对象
Function.prototype = [Function]
Object.prototype ={}
Array.prototype = []
Person.prototype = Person {}
Student.prototype = Student {} /student继承Person
String.prototype = [String:'']
Boolean.prototype = [Boolean:false]
Number.prototype =[Number:0]
3. __ proto __
对象的proto = 该对象构造函数.prototype
[1,2,3].__proto__ = []
89.__proto__ = [Number:0]
true.__proto__ = [Boolean:false]
{a:1}.__proto__ = {}
p1.__proto__ = Person{}
Number.__proto__ = [Function]
Object.__proto__ = [Function]
String.__proto__ = [Function]
Person.__proto__ = [Function]
五、原型链
通过 __proto__
链起来的一条链
123.__proto__ = [Number:0] //(它是一个对象:Number.prototype)
123.__proto__ .__proto__= {}(第二层Object.prototype)
123.__proto__ .__proto__.__proto__= null(第三层:{}空对象的原型是null)
所有的原型链最终都是null
Object:{}->null
[1,2,3]:[] -> {} -> null
'123':[String:''] ->{} ->null
false:[Boolean:false] ->{} -null
29:[Number:0] -> {} ->null
Person,Number:[Function]->{}->null