javaScript语言精粹 学习笔记(3.6对象反射)

本例主要说明hasOwnProperty函数的使用:

<html>
<body>
<script type="text/javascript">

if (typeof Object.beget !=='function'){
  Object.beget=function(o){
    var F = function(){};
    F.prototype = o;
    return new F();
  };
}
var o={arg1:"张三",arg2:""};
var instance = Object.beget(o);
instance.arg3="汉族";

document.write('tyoeof instance: ' + typeof instance + '<br>');
document.write('instance.arg1:' + instance.arg1 + '<br>');
document.write('instance.arg2:' + instance.arg2 + '<br>');
document.write('instance.arg3:' + instance.arg3 + '<br><br>');

document.write('tyoeof o: ' + typeof o + '<br>');
document.write('o.arg1:' + o.arg1 + '<br>');
document.write('o.arg2:' + o.arg2 + '<br>');
document.write('o.arg3:' + o.arg3 + '<br><br>');

document.write('instance.hasOwnProperty("arg2"):' + instance.hasOwnProperty("arg2") + '<br>');
document.write('instance.hasOwnProperty("arg3"):' + instance.hasOwnProperty("arg3") + '<br>');

</script>
</body>
</html>
View Code

其中的:

instance.arg3="汉族";

表明的arg3不是从o对象原型中继承来的,所以在使用hasOwnProperty检测的时候显示如下结果:

instance.hasOwnProperty("arg2"):false    //arg2属性是从原型o继承而来。
instance.hasOwnProperty("arg3"):true   //arg3属性是自定义的。

//=========================================================

另外一种情况:如果instance“修改”了属性arg2,那么hasOwnProperty('arg2')的值会变成true!

instance.arg2="汉族";
document.write('instance.hasOwnProperty("arg2"):' + instance.hasOwnProperty("arg2") + '<br>'); //此处输出结果应为true

这里的arg2本质上是为instance对象新增的属性,而不是原型(o)中的arg2,可以用下面的代码来验证:

<html>
<body>
<script type="text/javascript">

if (typeof Object.beget !=='function'){
  Object.beget=function(o){
    var F = function(){};
    F.prototype = o;
    return new F();
  };
}
var o={arg1:"张三",arg2:""};
var instance = Object.beget(o);
instance.arg2="汉族";

document.write('instance.arg2:' + instance.arg2 + '<br>');
document.write('o.arg2:' + o.arg2 + '<br>');

document.write('instance.hasOwnProperty("arg2"):' + instance.hasOwnProperty("arg2") + '<br>');

</script>
</body>
</html>
View Code

其输出结果为:
instance.arg2:汉族            //说明instance的arg2属性已被修改
o.arg2:男                //修改后完全不影响“原型”(o)的arg2属性值
instance.hasOwnProperty("arg2"):true  //修改后的arg2是instance的“OwnProperty”!


分析原因:
javascript解释器在遇到instance.arg2语句时,按照下列步骤进行检查:

如果 instance 对象上有arg2属性
    返回 instance.arg2 的值  //此时instance.hasOwnProperty("arg2"):true
否则如果 instance 的“父对象”o上有arg2属性
    返回o.arg2的值        //此时o.hasOwnProperty("arg2"):true
……
直至 Object上是否有arg2的值,如果都没有此属性,则返回undefined.

 

 

posted on 2013-12-17 12:43  赵成业  阅读(125)  评论(0)    收藏  举报

导航