日期:2014-05-16  浏览次数:20433 次

JavaScript语言精粹 对象(检索,原型prototype)
对于丑陋的事物,爱会闭目无视

JavaScript中的对象是可变的键控集合(keyed collections)
对象是属性的容器,其中每个属性都拥有名字和值。属性的名字可以是
包括字符串在内的任意字符串,属性值可以是除undefined值之外的任何值

JavaScript中的对象是无类别的,它对新属性的名字和值没有约束。对象适合
用于收集和管理数据。对象可以包含其他对象,所以它们可以容易地表示成
树形或图形结构(注意:树和图强大的数据结构)

JavaScript包括一个原型链特性,允许对象继承另一对象的属性。正确地使用它能
减少对象初始化的时间和内存消耗


对象检索

var empty_object = {};
var stooge = {
	"first-name":"Ouyang",
	"last-name":"ping",
	"yyl":"yyl"
}
alert(stooge["first-name"]); //Ouyang
alert(stooge.first-name);//NaN
alert(stooge.yyl)//yyl
alert(stooge.name);//undefined


||运算符可以用来填充默认值
var middle = stooge["middle-name"] ||"none";

flight.equipment // undefined
flight.equipment.model // throw "TypeError"
flight.equipment && flight.equipment.model //undefined


原型

返回对象类型原型的引用。

objectName.prototype

objectName 参数是对象的名称
原型连接在更新时是不起作用的,当我们对某个对象做出改变时,不会触及到该对象
的原型,原型连接只有在检索值的时候才被用到,如果我们尝试去获取对象的某个属性,且
该对象没有此属性,那么JavaScript会试着从原型对象中获取属性值。如果那个原型对象也
没有该属性,那么再从它的原型中寻找,依次类推,直到该过程最后到达
终点Object.prototype,如果想要的属性完全不存在于原型链中,那么结果就是
undefied值,这个过程成为委托。

function TestObjectA() 
{ 
    this.MethodA = function() 
    { 
       alert('TestObjectA.MethodA()'); 
    } 
} 

function TestObjectB() 
{ 
	this.bb = 'ccc';
    this.MethodB = function() 
    { 
       alert('TestObjectB.MethodB()'); 
    } 
} 

TestObjectB.prototype = new TestObjectA(); //TestObjectB继承了 TestObjectA的方法

TestObjectB.prototype.bb = 'aaaaa'; //添加属性
var temp
var b = new TestObjectB();
for (temp in b) {
  alert(temp); // MethodA  bb MehtedB
}
var kk = new TestObjectB();
//删除,但原型链中的没有删除
alert(kk.bb); // ccc
delete kk.bb;
alert(kk.bb); // aaaa

alert(kk.MethodA()); //TestObjectA.MethodA()


此处转载 http://fengsky491.iteye.com/blog/228583 谢谢 fengsky491
JScript里的prototype,为什么我们说它和prototype pattern里的prototype不一样呢?! 这个不是我说就说出来的,也不是我吹出来的,看看这个示例,你就能大概糊涂: 
 <script language="javascript">
function RP() 
{ 
    RP.PropertyA = 1; 
    RP.MethodA = function() 
    { 
         alert("RP.MethodA "); 
    }; 
    
    this.PropertyA = 100; 
    this.MethodA = function() 
    { 
         alert("this.MethodA"); 
    }; 
} 

RP.prototype.PropertyA = 10; 
RP.prototype.MethodA = function() 
{ 
    alert("RP.prototype.MethodA"); 
}; 
</script> 
   不要着急,还没有开始做示例,只是给出了我们用来演示的一个类。RP是什么?rpwt吗?当然不是了,RP是ResearchPrototype了。好了不废话了,看示例及结果分析。  
<script language="javascript"> 
rp = new RP(); 
alert(RP.PropertyA); 
RP.MethodA(); 
alert(rp.PropertyA); 
rp.MethodA(); 
</script> 
    运行结果闪亮登场: 
   1 
   RP.MethodA 
   100 
   this.MethodA 
    这个%$@#^$%&^...,不要着急,继续看哦! 


<script language="javascript"> 
rp = new RP(); 
delete RP.PropertyA; 
alert(RP.PropertyA); 
delete RP.MethodA; 
RP.MethodA(); 
delete rp.PropertyA; 
alert(rp.PropertyA); 
delete rp.MethodA; 
rp.MethodA(); 
</script> 
    运行结果再次登场: 
   undefined 
   A Runtime Error has occurred. 
   Do you wish to Debug? 
   Line: 32 
   Error: Object doesn't support this property or method 
   10 
   RP.prototype.MethodA 

    好玩吧,看出来什么名堂了吗?这里的RP.PropertyA和RP.MethodA只是用来做参照的,可是怎么把this.PropertyA和this.MethodA都delete了,还能出来结果,而且还是prototype导入的属性和方法呢?

    这就是JScript的prototype和prototype pattern中prototype最大的不同了,JScript中的这个所谓的prototype属性其实是个