zoukankan      html  css  js  c++  java
  • 【JavaScript】深入理解JavaScript之强大的原型和原型链

    由于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

    http://developer.51cto.com/art/201201/311273_2.htm

  • 相关阅读:
    WPF学习10:基于MVVM Light 制作图形编辑工具(1)
    外文翻译 《How we decide》赛场上的四分卫
    算法学习01:二分查询,选择法、插入法、分治法排序
    外文翻译 《How we decide》 Introduction
    WPF学习09:数据绑定之 Binding to List Data
    WPF学习08:MVVM 预备知识之COMMAND
    WPF学习07:MVVM 预备知识之数据绑定
    WPF学习05:2D绘图 使用Transform进行控件变形
    WPF学习06:转换控件内容为可存储图片
    WPF学习04:2D绘图 使用Shape绘基本图形
  • 原文地址:https://www.cnblogs.com/daishuguang/p/3923613.html
Copyright © 2011-2022 走看看