javascript原型prototype(2)

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

  当你创建一个新对象时,他可以选择某个对象作为它的原型。

View Code
function A(name){
this.name=name;
}
function B(name,sex){
this.name=name;
this.sex=sex;
}
function C(name,sex,hobby){
this.name=name;
this.sex=sex;
this.hobby=hobby;
}
A.prototype.say=function(){
alert(this.name);
}
B.prototype.show=function(){
alert(this.name+" : "+this.sex);
}
C.prototype.hello=function(){
alert(this.name+" : "+this.sex+" : "+this.hobby);
}
B.prototype=new A();
/*
原型连接必须定义在产生对象之前,才能生效,否则默认的原型连接是Function.prototype
会覆盖之前设置的原型连接所以alert(typeof b.say)返回underfiend
*/
B.prototype=new C();
var a=new A("小张");
var b=new B("小明","");
var c=new C("小李子","","打酱油");

b.hello();
alert(typeof b.say);


  读取和写入继承的属性

  每个类都有一个带有一组属性的原型对象。但是,一个类有很多的潜在的实例,每个实例都有继承这些原型属性.由于一个原型对象可以被很多对象继承,Javascript必须在读取和写入属性值的时候,执行一种基本的不对称.当读取对象O的属性p的时候,Javascript首先检查是否有一个名为p的对象.如果没有,它接下来检查O的原型对象是否有一个名为p的属性.这是的基于原型的继承能够奏效.

  当写入一个属性的值的时候,Javascript不会使用原型对象.要探究其原因,可以考虑如果它这么做的话会发生什么.假设要设置属性o.p的值,而对象o没有一个名为p的属性.进一步假设Javascript继续前进并查到属性p在o 的原型对象中,并且允许设置该原型的属性.现在,已近改变整个一类对象的p的值,而这并非本意.因此,属性继承只有在读取属性值的时候发生,而当写入属性值的时候不会发生.如果设置了一个对象o的p属性,而p属性是o从它的原型继承而来的, 那么,所发生的只不过是直接在o中创建了一个新的p属性.  既然o有了自己的名为p的属性,他不再从自己的原型中继承p的值.当读取p的值的时候,javascipt首先查看o的属性,既然他发现p定义在o中,它就不需要查找原型对象,也就不会找到定义在原型中p属性的值.我们有时候说,o的属性"遮盖" 或 "隐藏" 了原型对象中的属性p. 

 

原文地址:https://www.cnblogs.com/unbreakable/p/2437247.html