<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>_protoype原型</title>
<script type="text/javascript">
/*
* prototype的使用
一:prototype的介绍
功能:
返回对象原型的引用
格式:
class.prototype
简单使用
function Person(name){
this.name=name;
}
//可以为Person类下的所有对象添加一个'age'的属性或者一个叫'eat'的函数
var p3 = new Person("小金");
Person.prototype.age=30;
Person.prototype.eat=function(){
console.log("吃饭");
return this.name+":"+this.age;
};
var p1 = new Person('小木');
var p2 = new Person("小火");
alert(p1.eat());
alert(p2.eat());
alert(p3.eat());
注意点:
是Person.prototype.age=30;
不是Person.age=30;
Person.prototype.age=30;---->是为Person类下的"对象"添加age属性。对象.age
Person.age=30;------->是为Person类添加属性。是一个"静态"属性。 类.age
二:原理
当程序加载Person函数时,会为Person构造器创建Person原型对象,它们是独立存在的
。构造器中有一个prototype属性指向了原型对象,原型对象中有一个constructor属性指向构造器,当Person类的实例在使用一个不存在的属性时,会自动到Person构造器的原型对象中找。
function Person(name){
this.name=name;
}
var p1 = new Person('小木');
console.log(p1.constructor);
console.log(Person.prototype.constructor);
>>>p1.constructor:p1对象中没有constructor属性,所以会到Person构造器的原型对象中去找,原型对象中的constructor指向了Person构造器,所以最后返回了Person构造器
注意:
function Person(name){
this.name=name;
}
//可以为Person类下的所有对象添加一个'age'的属性或者一个叫'eat'的函数
var p3 = new Person("小金");
Person.prototype.age=30;
Person.prototype.eat=function(){
return this.name+":"+this.age;
};
var p1 = new Person('小木');
var p2 = new Person("小火");
p2.age=20; //------p2动态添加了一个age属性。
alert(p1.age+":"+p2.age);
//p1.age----》自己中找不到,所以去原型对象中找---->30
//p2.age----》现在自己中找,找不到才去原型对象中找---->20
三:原型继承:“所有类的父类都是object”,所有类的实例对象的父类是自己类的原型对象;
console.log(p1.toString());
p1对象中没有toString()方法----->原型对象中也没有toString方法---->object中有。
对象------>类的原型对象------->object;
(Person.prototype) = new Object();
产生一个疑问?
js中有重载和重写吗?
java中重载:方法名相同,参数个数不同。(子类)
java中重写:方法名,参数相同。方法实现改变。(子类)
function Person(name){
this.name=name;
}
这种叫做重写吗?
Person.prototype.toString=function(){
console.log(this.name);
};
var p1 = new Person('小木');
p1.toString();
function Person(name){
this.name=name;
}
这种叫做重载吗?
Person.prototype.toString=function(a,b){
console.log(this.name+a+b);
};
var p1 = new Person('小木');
p1.toString(2,3);
四:原型链!!!!!!!!(重要)
》》》先找自己---》类的原型对象-----》object《《《《
function Person(name){
this.name=name;
}
Object.prototype.age=30;
Object.prototype.eat=function(){
alert("吃饭了");
}
var p1 = new Person('小木');
alert(p1.age);
p1.eat();
练习一:扩展数组的功能:为每一个数组添加一个方法,可以查找某个元素所在的位置
Array.prototype.search=function(a){
var kaiguan = false;
for(var i=0;i<this.length;i++){
if(a==this[i]){
kaiguan=true;
}
}
return kaiguan? i :-1;
}
var arr=[0,1,2,3,4];
alert(arr.search(5));
练习二:扩展数字类的功能:
为每一个数字对象添加一个方法,该方法的参数为任意数目的整数,然后将所有参数
累加到一起并返回。
Number.prototype.max=function(){
var num=0;
for(var i=0;i<arguments.length;i++){
num+=arguments[i];
}
return num ?num :-1;
}
var a = new Number ();
alert(a.max());
alert(a.max(1,2,4,8,9));
*/
</script>
</head>
<body>
</body>
</html>