理论基础:先介绍创建对象的三种方式
1、字面量
的方式
2、调用系统构造函数
3、自定义
创建对象
//使用自定义构造函数创建对象
function Peroson(name,age){
this.name=name;
this.age=age;
this.eat=function () {
console.log("吃火锅");
}
}
var per1=new Peroson("小白",20);
var per2=new Peroson("小黑",10);
per1.eat();
per2.eat();
console.log(per1.eat == per2.eat);
使用
自定义构造函数创建对象
带来的问题:浪费空间,数据不能共享
解决办法:通过原型
来解决:数据共享,节省空间
解决案例:
//1、自定义构造函数
function Person(name,age){
this.name=name;
this.age=age;
}
//2、通过原型来添加方法,作用:数据共享,节省空间
Person.prototype.eat=function () {
console.log("吃火锅");
}
//3、实例化对象
var per1=new Person("小白",18);
var per2=new Person("小黑",20);
console.log(per1.eat == per2.eat);//true,说明是同一种方法(数据共享)
那么什么样的数据写在原型中?
需要共享
就写在原型中,不需要共享
则写在构造函数中
接下来,再写个例子?
//需求:
//人物:学生一,学生二,姓名不同,年龄不同
//身高都是170,每天写500行代码,吃10块钱的饭
function Student(name,age) {
this.name=name;
this.age=age;
}
Student.prototype.height=170;//身高相同(共享的数据)
Student.prototype.code=function () {
console.log("写500行代码");
};
Student.prototype.eat=function(){
console.log("吃10块钱的饭");
};
var stu1=new Student("小白",18);
var stu2=new Student("小黑",20);
console.log(stu1.height==stu2.height);//true(说明数据共享)
console.log(stu1.code==stu2.code);//true(说明数据共享)
console.log(stu1.eat==stu2.eat);//true(说明数据共享)
清楚了数据共享后,同时原型对象中的方法也是可以
互相访问
的
同样,还是写个例子说明一下?
function Dog(name,height){
this.name=name;
this.hright=height;
}
//在原型上添加方法
Dog.prototype.eat=function () {
console.log("吃狗粮");
this.play();//在当前方法中调用play()方法,说明了方法是可以互访的
}
Dog.prototype.play=function () {
console.log("玩尾巴");
}
//调用eat()方法
var dog1=new Dog("大黄",50);
dog1.eat(); //吃狗粮的同时还可以玩尾巴
//那么如果原型对象中有重名会如何执行?以上述为例?
Dog.prototype.name="小黄";
console.log(dog1.name);//打印输出为"大黄"
总结:查找属性会先从构造函数所创建的实例对象中去找,
找不到则去原型对象中找,再找不到则输出undefined