【笔记】javascript原型属性prototype

在javascript中,函数本身也是一个包含了方法和属性的对象。


length返回的是参数的数量。


在第4章中,我们已经学习了如何定义构造器函数,并用它来新建(构造)对象。这种做法的主要意图是通过new操作符来调用函数,以达到访问对象this值的目的,然后,构造器就可
以将其所创建的对象返回给我们。这样,我们就有了一种赋予新建对象一定功能(即为其添加属性和方法)的方法。


利用原型添加方法和属性:
function Gadget(name,color){
 this.name = name;
 this.color = color;
 this.wharAreYou = function(){
  return 'I am a ' + this.color + ' ' + this.name;
 }
}

/* 通过prototype添加属性和方法 */
Gadget.prototype.price = 100;
Gadget.prototype.rating = 3;
Gadget.prototype.getInfo = function() {
 return 'Rating: ' + this.rating +',price: ' + this.price;
};

/* 除了以上的方式,还可以通过定义一个对象,然后将其覆盖到之前的原型上 */
Gadget.prototype = {
 price2:100,
 rating2:3,
 getInfo:function(){
  return 'Rating2 :' + this.rating2 + ',price2: ' + this.price2;
 }
};


/* 使用原型的方法和属性 */
var newtoy = new Gadget('webcam','black');


从运行的结果来看,后面的方式和前面方式并存的时候,会完全覆盖掉之前的原型。
对于原型来说,最终的是我们要理解它的“驻留”(live)概念。由于在javascript中,对象都是通过传引用的方式来传递的,因为我们创建的每个新对象实体中并没有一份属于自己的原型副本。
我们可以随时修改原型,并且与之相关的对象也都会继承这一改变。甚至可能会影响在修改之前就已经创建了对象。

但是如果对象是在逐个添加之前,则不会发生全部覆盖的情况。而是部分覆盖 :



可枚举属性:
newtoy.hasOwnProperty('price')
false
newtoy.hasOwnProperty('name')
true
newtoy.constructor.prototype.propertyIsEnumerable('price');
false        //书上是true

为什么和书上的有出入呢?



每个对象都有一个isPrototypeOf()方法,这个方法会告诉我们当前对象是否是另一个对象的原型。

var monkey  = {
 hair:true,
 feeds:'bananas',
 breathes:'air'
};

function Human(name){
 this.name = name;
}

Human.prototype = monkey;

var george = new Human('George');
monkey.isPrototypeOf(george);

-> true


神秘的__proto__
__proto__实际上是某个实体对象的属性,而prototype则是属于构造器函数的属性。
千万要记住,__proto__只能在学习或调试的环境下使用。









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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值