1.构造函数
构造函数和普通函数的区别:
1.构造函数的函数名习惯上首字母大写。
2.构造函数需要new关键字来调用。
构造函数为:
function Person(name,age,gender){
this.name=name;
this.age =age;
this.gender=gender;
this.text=function (){
document.write("这是一个函数");
}
}
构造函数创建对象:
var per=new Person("孙悟空",18,"男");
var per2=new Person("猪八戒",17,"男");
注:使用同一构造函数创建的对象称为一类对象,也将该构造函数成为一个类,所创建的对象称为该类的实例。
注:可用instanceof检查某个对象是否是一个类的实例 per instanceof Person
2.原型对象
第一:prototype属性
(1).函数的内部都有一个属性:prototype, 该属性默认指向一个原型对象;
(2).该原型对象中有一个constructor属性,该属性指向本函数对象;
(则函数与它的原型对象可以相互转换、指向。fun.prototype.constructor=fun)
原型对象:就是一个空Object对象
第二:显示原型与隐式原型
(1).每个函数都有一个prototype属性,即显式原型
(2).该函数的实例对象都有一个__proto__属性,即隐式原型
*实例对象的__proto__属性指向原型对象
*即函数的显式原型和函数实例的隐式原型指向相同,都指向原型对象
*通过函数的显式原型prototype可以给原型对象添加属性或方法。
*该函数的所有实例对象都可以用原型中的属性与方法。
给原型对象添加属性或方法:
Fun.prototype.a=1000
Fun.prototype.test=function(){
console.log('123');
}
原型对象的作用:
原型对象相当于一个公共区域,函数所有的实例都可访问,则可将共有的属性或方法都统一添加到原型对象中,这样可以不用分别添加,也不会影响到全局的作用域。
3.原型链:
别名:隐式原型链 (沿着__proto__的这条链)
作用:查找函数实例对象的属性(方法)
访问一个函数实例对象的属性或方法时,会按照原型链来查找:
1.先在对象自身中找,找到就可返回
2.如果没有,再沿着__proto__这条链向上查找,一直找到原型的尽头,找到返回 (先在原型对象中找,找不到就在原型的原型中找)
3.如果最终没有找到,返回undefined;
原型链的结构:
*Object的原型对象是原型链的尽头,toString等方法都是放在了Object的原型对象中。
*实例对象的原型的原型是Object的显式原型
4. 扩展方面
所有对象都是Function的实例
var obj = new Object()
所有函数都是Function的实例(包括自身)
var fun = new Function()
Object是Function的实例
5.instanceof的判断
instanceof:用来判断一个对象是否为一个函数的实例对象;
若A instanceof B ,则判断A是否为B的实例对象,若是则返回true,若不是返回false;
instanceof是如何判断的??
*表达式: A instanceof B
*如果B函数的显式原型在A对象的原型链上,返回true,否则返回false
(B的显式原型在A的原型链上就可以,不管是哪级隐式原型链)
6.练习
<script type="text/javascript">
function F (){}
Object.prototype.a=function(){ //a添加到Object的原型
console.log("a()");
}
Function.prototype.b=function(){ //b添加到Function的原型
console.log("b()");
}
var f =new F();
f.a();
//返回a(),他会先在f中找,找不到就去原型中找,
//再找不到,就去f的原型的原型中找,
//f的原型的原型,就是Object.prototype;
//f.b();
//返回undefined,在原型链尽头也没有;
F.a();
//返回a()
//函数的原型对象就是一个object空对象,
//则函数原型的原型就是Object.prototype;
F.b();
//返回b()
// var F=new Function();
// F则为Function的实例,可访问原型对象中的内容
</script>