小心 ------ javascript(5)

43 篇文章 0 订阅
35 篇文章 0 订阅

在JavaScript中创建的每个函数都有一个prototype(原型)属性,这个属性是一个指针(指向一个对象),而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法

使用原型对象的好处是可以让所有对象实例共享它所包含的属性和方法

function JaXiang() {

}
JaXiang.prototype.location = "Luo Yang";

JaXiang.prototype.age = 5000;

JaXiang.prototype.writeLocation = function () {
    return this.location;
};
var oJaXiangL = new JaXiang();

var oJaXiangY = new JaXiang();

oJaXiangL.writeLocation();
      
oJaXiangY.writeLocation();

虽然oJaXiangL和oJaXiangY这两个实例都不包含属性和方法,但却可以访问age和location属性并且调用writeLocation方法,这是通过查找对象属性的过程来实现的,每当代码读取某个对象的某个属性时,都会执行一次搜索,目标是具有给定名字的属性。搜索首先从对象实例本身开始。如果在实例中找到了具有给定名字的属性,则返回该属性的值;如果没有找到,则继续搜索指针指向的原型对象,在原型对象中查找具有给定名字的属性。如果在原型对象中找到了这个属性,则返回该属性的值。

使用hasOwnProperty()方法可以检测一个属性是存在于实例中,还是存在于原型中。这个方法(不要忘了它是从Object 继承来的)只在给定属性存在于对象实例中时,才会返回true。  

 

function JaXiang() {

}
JaXiang.prototype.location = "Luo Yang";

JaXiang.prototype.age = 5000;

JaXiang.prototype.writeLocation = function () {
    return this.location;
};
var oJaXiangL = new JaXiang();

var oJaXiangY = new JaXiang();

//oJaXiangL.writeLocation();

//oJaXiangY.writeLocation();

oJaXiangL.location = null;

oJaXiangY.age = 5001;

虽然可以通过对象实例访问保存在原型中的值,但却不能通过对象实例重写原型中的值。如果我们在实例中添加了一个属性,而该属性与实例原型中的一个属性同名,那我们就在实例中创建该属性,该属性将会屏蔽原型中的那个属性。

function JaXiang() {

}
JaXiang.prototype.location = "Luo Yang";

JaXiang.prototype.age = 5000;

JaXiang.prototype.writeLocation = function () {
    return this.location;
};
var oJaXiangL = new JaXiang();

var oJaXiangY = new JaXiang();

//oJaXiangL.writeLocation();

//oJaXiangY.writeLocation();

oJaXiangL.location = null;

oJaXiangY.age = 5001;

delete oJaXiangL.location;

delete oJaXiangY.age;

 

当为对象实例添加一个属性时,这个属性就会屏蔽原型对象中保存的同名属性;换句话说,添加这个属性只会阻止我们访问原型中的那个属性,但不会修改那个属性。即使将这个属性设置为null,也只会在实例中设置这个属性,而不会恢复其指向原型的连接。不过,使用delete 操作符则可以完全删除实例属性,从而让我们能够重新访问原型中的属性。

 

function JaXiang() {

}
JaXiang.prototype.location = "Luo Yang";

var oJaXiangL = new JaXiang();

JaXiang.prototype.age = 5000;

JaXiang.prototype.writeLocation = function () {
    return this.location;
};     

JaXiang.prototype = {
    newLocation : "New Luo Yang",
    newAge: 10000,
    newWriteLocation : function () {
        return this.location;
    }
};

var oJaXiangY = new JaXiang();

使用(JaXiang.prototype.属性名 = 属性值;)这种方法随时为原型添加属性和方法,并且修改能够立即在所有对象实例中反映出来(即使是先定义变量再添加也可以);但如果是使用了(JaXiang.prototype= {属性名 = 属性值})这种语法重写整个原型对象后,之前创建的对象与之后创建的对象并不一样。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值