面向对象与原型03

/*

在了解如何使用原型模式创建对象之前,有必要先搞清楚什么是原型对象。
我们创建的每一个函数都有一个prototype属性,该属性是一个指针,该指针指向了一个对象。对于我们创建的构造函数,该对象中包含可以由所有实例共享的属性和方法。如下如所示:
在默认情况下,所有原型对象会自动包含一个constructor属性,该属性也是一个指针,指向prototype所在的函数:
在调用构造函数创建新的实例时,该实例的内部会自动包含一个[[Prototype]]指针属性,该指针指便指向构造函数的原型对象。注意,这个指针关联的是实例与构造函数的原型对象而不是实例与构造函数:

//1、构造函数
function Box(name,age){
this.name = name; //实例属性
this.age = age;
this.run = function(){//实例方法
return this.name+this.age
};
}
var box1 = new Box();//实例一个对象


*/

//2、原型创建
function Box(){} //构造函数函数体里面什么都没有,这里如果有,叫做实例属性
Box.prototype.name = 'zhao'; //原型属性 不用封装性 直接写
Box.prototype.age = 100; //原型属性 不用封装性 直接写
Box.prototype.run = function(){
return this.name+this.age //原型方法
};
var box1 = new Box();
var box2 = new Box();
    box1.age = '343434'; //如果这里实例一个属性 会先弹出这个属性 因为先查找构造函数实例里面的属性和方法
//如果有 就立即返回 如果构造函数里面原型有 就找原型的 实例属性不会共享 只有原型可以共享
//delete box1.age 删除实例中的属性

alert(box1.constructor); //构造属性,可获取构造函数本身 作用就是被原型指针定位
//prototype ,然后得到构造函数本身
  alert(box1.age); //调用方法还是和构造函数一样的
alert(box1.run==box2.run); //调用方法还是和构造函数一样的

alert(box1.prototype); //这个访问不到
alert(box1.__proto__);  //可以访问 测试每个函数都有一个prototype
//如果是构造函数的实例化方法,不同的实例化,他们方法的地址 是不一样的
//如果是原型方法,那么他们的地址是共享的,大家是一样的

//判断一个对象实例(对象引用)是不是指向了原型对象(构造函数) 只要实例化了 他是自动指向的
alert(Box.prototype.isPrototypeOf(box1));

//很多时候,我们为了书写的方便以及直观上的”封装性”,我们往往采用对象字面量直接重写整个原型对象
Box.prototype = {
 constructor : Student,
 name : "easy",
 age : 20,
 alertName : function() {
alert(this.name);
 }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值