您当前的位置: 首页 > 学无止境 > JS经典实例 网站首页JS经典实例
javascript原型与对象-原型的方式创建对象-实例与原型
发布时间:2016-10-16 13:44:02编辑:雪饮阅读()
以原型的方式创建对象:
我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个对象。
使用原型的好处:
可以让所有对象实例共享它所包含的属性和方法。
也就是说,不必在构造函数中定义对象信息,而是可以直接将这些信息添加到原型中。
function Box(){
Box.prototype.name='雪饮';//原型属性
Box.prototype.age=24;
Box.prototype.run=function (){
return this.name+this.age+'运行中。。';
}
//原型方法
/*
构造函数体内的属性叫做实例属性,普通构造函数体内的方法叫做实例方法
以原型来声明的方法和属性叫做原型属性和原型方法
*/
}
var box1=new Box();
alert(box1.run());
如果是实例方法,不同的实例化,他们的方法地址是不一样的。
如果是原型方法,那么他们的地址是共享的,大家都是一样。
以box1.run这种不带括号的调用方法是调用了该方法的地址,而带括号的则是调用该方法的返回值。那么此时调用不同实例的原型
方法地址用if比对结果就是地址一样。
普通构造函数中实例属性的地址也是不一样的,原型构造函数中的原型属性是一样的共享的。只是不好测试普通构造函数中的实例属性
地址而已。
虽然prototype是每个函数都有的原型属性,但是prototype是以指针(__proto__)的形式作为属性于该函数的,该指针指向prototype,所以我们要想
访问prototype应该这样访问:
alert(box1.__proto__);
而直接访问prototype则是不可以的
该属性(__proto__)在低版本的ie上面是不支持的
构造属性:
可以获取构造函数本身
作用:被原型指针定位,然后得到函数本身,如:
alert(box1.constructor);
访问该属性可以获取构造函数本身的声明过程
判断一个对象实例是不是指向了原型对象:(基本上,只要实例化了,它就自动指向的,无论你是否在构造函数中使用过prototype来声明属性或方法)
语法:构造函数名.prototype.isPrototypeOf(实例名)
function Box(){
Box.prototype.name='雪饮';
Box.prototype.age=24;
Box.prototype.run=function (){
return this.name+this.age+'运行中。。';
}
}
var box1=new Box();
var box2=new Box();
alert(Box.prototype.isPrototypeOf(box1));
原型模型的执行流程:
1、先查找构造函数实例里的属性或方法,如果有,立刻返回。
2、如果构造函数实例中没有,就去它的原型对象里找,如果有就返回。
如:
(1)没有实例属性,通过实例化之后才赋值:
function Box(){
Box.prototype.name='雪饮';
Box.prototype.age=24;
Box.prototype.run=function (){
return this.name+this.age+'运行中。。';
}
}
var box1=new Box();
box1.name="杜敏捷";
alert(box1.name);
(2)有实例属性,原型在构造函数之后才声明:
function Box(){this.name="杜敏捷";}
Box.prototype.name='雪饮';
Box.prototype.age=24;
Box.prototype.run=function (){return this.name+this.age+'运行中。。';}
var box1=new Box();
alert(box1.name);
以上两种情况都遵循了原型模型的执行流程
实例属性的删除:语法:delete 实例名.属性名
function Box(){this.name="杜敏捷";}
Box.prototype.name='雪饮';
Box.prototype.age=24;
Box.prototype.run=function (){return this.name+this.age+'运行中。。';}
var box1=new Box();
delete box1.name;//实例属性的删除
alert(box1.name);
原型属性的删除:语法:delete 原型名(构造函数名).prototype.属性名;
function Box(){this.name="杜敏捷";}
Box.prototype.name='雪饮';
Box.prototype.age=24;
Box.prototype.run=function (){return this.name+this.age+'运行中。。';}
var box1=new Box();
delete Box.prototype.name;//原型属性的删除
alert(box1.name);
判断实例中是否有指定的实例属性:语法:实例名.hasOwnProperty('属性名')
function Box(){this.name="杜敏捷";}
Box.prototype.name='雪饮';
Box.prototype.age=24;
Box.prototype.run=function (){return this.name+this.age+'运行中。。';}
var box1=new Box();
alert(box1.hasOwnProperty('name'));
如果有就返回true,否则返回false;
判断实例中是否有指定属性(无论原型属性或实例属性):语法:属性名 in 实例名
function Box(){this.name="杜敏捷";}
Box.prototype.name='雪饮';
Box.prototype.age=24;
Box.prototype.run=function (){return this.name+this.age+'运行中。。';}
var box1=new Box();
alert('name' in box1);
关键字词:javascript,对象,原型