JS的原型理解

js的原型系统,主要包含以下三个基本元素

一、属性

  1. prototype
  2. __ proto __
  3. 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

转载于:https://www.jianshu.com/p/3e346e0c1219

猜你喜欢

转载自blog.csdn.net/weixin_34248487/article/details/91199684