JavaScript引用类型之原型prototype


什么是原型


    Javascript对象中的原型属性可以返回对象类型的原型引用,原型prototype归构造方法所有。


    JavaScript中,每个对象都连接到一个原型对象,并且它可以从中继承属性。所有通过对象字面量创建的对象都连接到Object.prototype,它是JavaScript中的标配对象。

 

    当你创建一个新对象的时候,你可以选择某个对象作为它的原型,新对象具有原型对象的所有属性和方法。如果新对象有和原型中同名的属性或方法,新对象的覆盖原型中的。


function Cat(){
	this.name = "tomcat";
	this.age = 3;
	this.salary = 123;
	this.sayName = function(){
		alert(this.name);
	}
}

function CatSon(){
	this.name = "dingdang";
	this.address = "new york";
	this.father = "tomcat";
	this.hobby = "fishing";
};

CatSon.prototype = new Cat;

var catSon = new CatSon;
alert(catSon.age); // output 3
alert(catSon.father); // output tomcat
catSon.sayName(); // output dingdang

    上面的代码中,我们定义了两个构造方法Cat() 和 CatSon(),其中CatSon.prototype指向了new Cat; 即CatSon 的原型指向了Cat 实例,那么CatSon 的实例拥有Cat 实例的所有属性和方法。



    由于CatSon 自己也定义了name属性,所以,CatSon的实例catSon 的name属性值为dingdang ,即同名的子实例属性覆盖原型属性。


    当我们对某个对象做出改变时,不会触及该对象的原型。

 

    接上面代码,我们修改catSon.name

// 对对象的修改,不会触及到原型
catSon.name = "jiafei";
alert(CatSon.prototype.name); // output tomcat



委托


    原型连接只有在访问属性值的时候才被用到。如果我们尝试去获取对象的某个属性值,但该对象没有此属性名,那么JavaScript会试着从原型对象中获取属性值。如果那个原型对象也没有该属性,那么再从它的原型中寻找,以此类推,直到该过程最后达终点Object.prototype。如果想要的属性完全不存在于原型链中,那么结果就是undefined值。这个过程称为委托


    上面的代码中,我们访问catSon.door 属性

    由于CatSon 没有定义door属性,CatSon 的原型 Cat 也没有定义该属性,到了Cat 的原型Object 里面也没有定义该属性,所以catDoor属性值为undefined。


alert(catSon.door); // output undefined


    原型关系是一种动态的关系。如果我们添加一个新的属性到原型中,该属性会立即对所有基于该原型创建的对象可见。

// 原型的动态绑定
Object.prototype.door ="blueDoor";
alert(catSon.door); //output blueDoor


跟prototype相关方法


    接下来,看看在Object 类里面的几个跟原型相关的方法。


hasOwnProperty


      判断对象是否有某个特定的属性。

      这是属性必须是该对象自有的属性,不能是从原型处继承来的属性或方法。


alert(catSon.hasOwnProperty("name")); // true
alert(catSon.hasOwnProperty("sayName")); // false


isPrototypeOf(object)


    判断该对象是否为另一个对象的原型

alert(Cat.prototype.isPrototypeOf(catSon));// true
alert(CatSon.prototype.isPrototypeOf(catSon));// true
 

var obj = new Object;
alert(CatSon.prototype.isPrototypeOf(obj));// false

propertyIsEnumerable(property)


        判断给定的属性是否可以用for…in 语句进行枚举

alert(catSon.propertyIsEnumerable("name")); // true

for (pro in catSon){
	alert(pro + "=" + catSon[pro]);
}





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值