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>
其中的:
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>
其输出结果为:
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.
浙公网安备 33010602011771号