在原型模式声明中,多了两个属性,这两个属性都是创建对象时自动生成的、——proto——属性是实例指向原型对象的指针,他的作用就是指向构造函数的原型属性constructor,通过这两个属性就可以访问原型里的属性和方法了
// function Box(name,age){ //构造方法
// this.name=name; //实例属性
// this.age=age;
// this.run=function(){ //实例方法
// alert(this.name+this.age+"running....")
//
// };
//
//
// }
function Box(){
}; //这里什么都没有,如果有则为实例属性或者实例方法
Box.prototype.name="xixi"; //原型属性
Box.prototype.age=15;
Box.prototype.run=function(){ //原型方法
alert(this.name+this.age);
}
// 原型属性(方法)和实例属性(方法)的区别在于共享与否
var a=new Box();
var b=new Box();
// 如果是实例方法,不同的实例化,他们的方法地址是不一样的,是唯一的
// 如果是原型方法,那么他们的地址是共享的,大家都是一样的
// alert(a.run==b.run)//true,如果是 构造函数创造的,(返回结果为false,因为他们是引用类型的值)
//
// alert(a.prototype)//undifined 这个属性是一个对象,访问不到
// alert(a.__proto__)//object 这个属性是一个指针,指向prototype源性对象
// alert(a.constructor)//构造属性,可以获取构造函数本身
// //作用是被原型指针定位,然后获得构造函数本身
// //其实就是对象实例对应的原型对象的作用
// alert(Box.prototype.isPrototypeOf(a));
//alert(Object.prototype.isPrototypeOf(a));// Object的原型所有的对象的原型
a.name="jack"//实例属性,并没有重写原型属性
alert(a.name)//就近原则
原型模式执行流程
1:先查找构造函数实例里面的属性或方法,如果有则立刻返回
2:如果构造函数实例里面没有,则去他的原型对象里面找,如果有则返回
ps:虽然可以通过实例访问 保存在对象里面的值,但是不能通过对象实例重写原型中的值
}
</script>
</body>
</html>
2017-04-1511:54:14