javascript面向对象 代码详解(三)

//每个对象都有一个prototype(原型属性),
//这个属性是另外一个对象的引用
//这个属性其实就是一个对象
//它的用途是包含可以由特定类型的所有实例共享的属性和方法

//构造函数的写法
function Box(name,age)
{
	this.name = name;      //实例属性
	this.age = age;        //实例方法
	this.run = function()
	{
		return this.name + this.age + "运行中";
	};
}


//原型方法创建对象
//构造函数函数体内什么都没有,
//这里如果有,叫做实例属性,实例方法

function Box(){}  
Box.prototype.name = "Lee";    //原型属性
Box.prototype.age = 100;          //原型属性
Box.prototype.run = function()  //原型方法
{
	return this.name + this.age + "运行中...";
}

var box1 = new Box();
var box2 = new Box();
//alert(box1.name);
//alert(box1.run());

//如果是实例方法,不同的实例化,他们的方法地址是不一样的,是唯一的
//如果是原型方法,那么他们地址是共享的,大家都是一样的

//地址一样
alert(box1.run == box2.run);





//原型方法创建对象
//构造函数函数体内什么都没有,
//这里如果有,叫做实例属性,实例方法

function Box(){}  
Box.prototype.name = "Lee";    //原型属性
Box.prototype.age = 100;          //原型属性
Box.prototype.run = function()  //原型方法
{
	return this.name + this.age + "运行中...";
}

var box1 = new Box();
var box2 = new Box();

//创建每个对象都有prototype属性 打印undefined
//但是他会产生__proto__属性
//__proto__其实就是prototype 只不过是prototype这个对象的指针属性
//prototype这个属性是个对象,访问不到

alert(box1.prototype);

//__proto__这个属性是一个指针指向prototype原型对象
alert(box1.__proto__); //打印出[Object object] 在IE浏览器不支持

//constructor 是构造函数的原型属性 叫做构造属性
alert(box1.constructor); //构造属性,可以获取构造函数本身
                                        //作用是被原型指针定位,然后得到构造函数本身
										//其实就是对象实例对应的原型对象的作用


//原型方法创建对象
//构造函数函数体内什么都没有,
//这里如果有,叫做实例属性,实例方法

function Box(){}  
Box.prototype.name = "Lee";    //原型属性
Box.prototype.age = 100;          //原型属性
Box.prototype.run = function()  //原型方法
{
	return this.name + this.age + "运行中...";
}

var box1 = new Box();
var box2 = new Box();

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

var obj = new Object();
alert(Box.prototype.isPrototypeOf(obj));


//原型模式的执行流程
//1.先查找构造函数实例里的属性和方法,如果有,立刻返回
//2.如果构造函数实例没有,则去它的原型对象里找,如果有,就返回

function Box()
{
	this.name = "Jack";
}  
Box.prototype.name = "Lee";    //原型属性
Box.prototype.age = 100;          //原型属性
Box.prototype.run = function()  //原型方法
{
	return this.name + this.age + "运行中...";
}

var box1 = new Box();
var box2 = new Box();

//box1.name = "Jack";   //实例属性,并没有重写原型属性

alert(box1.name);  //就近原则

//实例属性不会共享,所以box2访问不到实例属性,那就只能访问原型
alert(box2.name);

delete box1.name                     //删除实例中的属性
alert(box1.name);                       //可以访问原型中的属性

//delete Box.prototype.name     //删除原型中的属性
Box.prototype.name = "KKK"; //覆盖原型中的属性  
alert(box1.name);



function Box()
{
	
}  
Box.prototype.name = "Lee";    //原型属性
Box.prototype.age = 100;          //原型属性
Box.prototype.run = function()  //原型方法
{
	return this.name + this.age + "运行中...";
}

var box1 = new Box();
box1.name = "Kac";

//判断实例中是否存在指定属性
alert(box1.hasOwnProperty("name"));

//不管实例属性、原型属性是否存在只要有返回true
//否则返回false
alert("name" in box1);


//判断只有原型中有属性
function isProperty(object,property)
{
	//实例中没有且在(原型或实例)中都有
	return (!object.hasOwnProperty(property)&&(property in object))
}

alert(isProperty(box1,"name"));


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值