JavaScript-原型链的学习与理解(个人学习)
1.对象的区别
分为普通对象和函数对象,只要通过new function的对象都是函数对象,其他的都是普通对象
2.构造函数
functiom Pepole(name,age,job){ this.name=name; this.age=age; this.sayname=function(){ alert(this.name) } } var Pepole1 = new Pepole('tangzhenye', 28, 'it');
this就等于是Pepole1中的this,执行的属性会添加到实例的对象中
Pepole1(实例)是Pepole(构造函数)的实例,Pepole1(实例)中有一个 constructor属性 (构造函数属性) 指向Pepole(构造函数);
相当于
function Pepole(){} Pepole.protytype.name=tangzhenye Pepole.protytype.age=28 Pepole.protytype.job=it Pepole.protytype.sayname=function(){ alert(this.name) }
不同的是这种写法是将属性写在隐式原型链上,输出一下就看得出来;查找属性的时候从自身开始,找到就停止;
什么是原型对象,原型对象就和上面的例子一样。
Pepole.prototype={ construtor:Pepole//*注1 name:tangzhenye, age:28, job:it, sayname:unction(){ alert(this.name) } }
*注1:默认情况下所有的原型对象(prototype)会自动获得一个construtor(构造函数)属性,这个属性是一个指针,指向prototype(原型对象)所在的构造函数Pepole
*
为什么实例会有construtor,原型对象也有construtor?因为是构造函数的实例所以有construtor属性,原型对象有是因为创建构造函数的时候,创建了实例对象并赋值给了prototype
原型对象,就是一个对象。原型对象的意思就是Pepole.prototype
4._proto_
在创建(所有)对象的时候,都会有一个叫做_proto_的内置属性,用于指向创建它的构造函数的原型对象
*综合以上知识点可以得出的结论
function Pepole(){} Pepole.__proto__==Function.prototype var Pepole1 = new Pepole(); Pepole1.__proto__==Pepole.prototype Pepole1.construtor==Pepole.prototype.construtor Pepole1.construtor==Pepole
5.构造器
比如我们创建一个对象,通常会
var a={}
var b=[]
同等与
var a=new Object()
var b=new Array()
......
这些就是构造器,都是函数对象.他们的隐式原型(_proto_)指向Function.prototype.连Function_proto_都指向自己
函数对象第一级指向其构造函数
a.constructor==Function
a.prototype.constructor==a
a._propo_==Functiom.prototype
a.__proto__.constructor==Function
a.__proto__.__proto__==Object.prototype
a.prototype.__proto__==Object.prototype
function a(){}
var as = new a()
as._proto_== a.prototype;
注意,as是对象不是函数,他的原型链找不在Function上
as._proto_._proto_.__proto_相当于a.prototype._proto_._proto_
*小问题
function eto(){
getName=function(){console.log(1)}
return this
}
eto.getName=function(){
console.log(2)
}
eto.prototype.getName=function(){
console.log(3)
}
var getName=function(){
console.log(4)
}
function getName(){
console.log(5)
}
问题是:
eto.getName();
getName();
eto(),getName();
getName();
new eto.getName();
new eto().getName();
new new eto().getName()
浙公网安备 33010602011771号