博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【JavaScript】深入理解JavaScript之强大的原型和原型链
阅读量:6681 次
发布时间:2019-06-25

本文共 1460 字,大约阅读时间需要 4 分钟。

由于JavaScript是唯一一个被广泛使用的基于原型继承的语言,所以理解两种继承模式的差异是需要一定时间的,今天我们就来了解一下原型和原型链。

AD:

 

hasOwnProperty函数:

hasOwnProperty是Object.prototype的一个方法,它可是个好东西,他能判断一个对象是否包含自定义属性而不是原型链上的属性,因为hasOwnProperty 是 JavaScript 中唯一一个处理属性但是不查找原型链的函数。

  1. // 修改Object.prototype  
  2. Object.prototype.bar = 1;   
  3. var foo = {goo: undefined};  
  4.  
  5. foo.bar; // 1  
  6. 'bar' in foo; // true  
  7.  
  8. foo.hasOwnProperty('bar'); // false  
  9. foo.hasOwnProperty('goo'); // true 

只有 hasOwnProperty 可以给出正确和期望的结果,这在遍历对象的属性时会很有用。 没有其它方法可以用来排除原型链上的属性,而不是定义在对象自身上的属性。

但有个恶心的地方是:JavaScript 不会保护 hasOwnProperty 被非法占用,因此如果一个对象碰巧存在这个属性,就需要使用外部的 hasOwnProperty 函数来获取正确的结果。

  1. var foo = {  
  2.     hasOwnProperty: function() {  
  3.         return false;  
  4.     },  
  5.     bar: 'Here be dragons' 
  6. };  
  7.  
  8. foo.hasOwnProperty('bar'); // 总是返回 false  
  9.  
  10. // 使用{}对象的 hasOwnProperty,并将其上下为设置为foo  
  11. {}.hasOwnProperty.call(foo, 'bar'); // true 

当检查对象上某个属性是否存在时,hasOwnProperty 是唯一可用的方法。同时在使用 for in loop 遍历对象时,推荐总是使用 hasOwnProperty 方法,这将会避免原型对象扩展带来的干扰,我们来看一下例子:

  1. // 修改 Object.prototype  
  2. Object.prototype.bar = 1;  
  3.  
  4. var foo = {moo: 2};  
  5. for(var i in foo) {  
  6.     console.log(i); // 输出两个属性:bar 和 moo  

我们没办法改变for in语句的行为,所以想过滤结果就只能使用hasOwnProperty 方法,代码如下:

  1. // foo 变量是上例中的  
  2. for(var i in foo) {  
  3.     if (foo.hasOwnProperty(i)) {  
  4.         console.log(i);  
  5.     }  

这个版本的代码是唯一正确的写法。由于我们使用了 hasOwnProperty,所以这次只输出 moo。如果不使用 hasOwnProperty,则这段代码在原生对象原型(比如 Object.prototype)被扩展时可能会出错。

总结:推荐使用 hasOwnProperty,不要对代码运行的环境做任何假设,不要假设原生对象是否已经被扩展了。

总结

原型极大地丰富了我们的开发代码,但是在平时使用的过程中一定要注意上述提到的一些注意事项。

原文:http://www.cnblogs.com/TomXu/archive/2012/01/05/2305453.html

 

你可能感兴趣的文章
php常用工具类
查看>>
systemd详解
查看>>
深入浅出Android打包
查看>>
goto语句
查看>>
Swift学习—函数
查看>>
Jqery Mobile 简单了解
查看>>
android edittext setInputType方法
查看>>
我的友情链接
查看>>
批量上传公钥到Linux服务器
查看>>
nagios+centreon总结之第八章——Centreon 添加nagios检查命令
查看>>
网页中的编码与乱码(1)
查看>>
CentOS源码安装GitLab汉化版
查看>>
yum 命令的使用,及yum仓库的创建
查看>>
iframe高度自适应的6个方法
查看>>
从构建分布式秒杀系统聊聊分布式锁
查看>>
电子邮件传输之SMTP协议
查看>>
AD域用户登录验证
查看>>
如何部署AD站点
查看>>
CISCO路由器常用命令
查看>>
mysql表行转列的用法
查看>>