zoukankan      html  css  js  c++  java
  • javascript 易错知识点合集

    为什么 typeof null === 'object'

    原理是这样的,不同的对象在底层都表示为二进制,在JavaScript中二进制前三位都为0的话会被判断为 object 类型, null 的二进制表示是全0,自然前三位也是0,所以执行 typeof 时会返回“ object ”。

    对象属性的存在性

    如 myObject.a 的属性访问返回值可能是 undefined ,但是这个值有可能是属性中存储的 undefined ,也可能是因为属性不存在所以返回 undefined 。那么如何区分这两种情况呢?

    var myObject = {
        a:2
    };
    
    // 方案一
    ("a" in myObject); // true
    ("b" in myObject); // false
    
    // 方案二
    myObject.hasOwnProperty( "a" ); // true
    myObject.hasOwnProperty( "b" ); // false
    
    // 方案三
    Object.prototype.hasOwnProperty.call(myObject, 'b')
    
    

    对象继承的三种方法

    参考如下代码:

    		function Foo(name) {
    			this.name = name;
    		}
    
    		Foo.prototype.myName = function() {
    			console.log(this.name)
    		}
    
    		function Bar(name, label) {
    			Foo.call(this, name);
    			this.label = label;
    		}
                    
                    // 方法1
    		Bar.prototype = Object.create(Foo.prototype)
                    
                    // 方法2
    		Bar.prototype = Foo.prototype;
    
                    // 方法3
                    Bar.prototype = new Foo();
    
    		//Bar.prototype.constructor = Bar;
    
    		Bar.prototype.sayName = function() {
    			console.log(this.name)
    		}
    
    		
    		var b = new Foo('fayin')
    	
    		b.sayName()
    
    

    上例中,三种方法都可以使 Bar 继承 Foo.prototype 上的方法,但它们之间又有微妙的差别:

    Object.create(..) 会凭空创建一个“新”对象并把新对象内部的 [[Prototype]] 关联到你指定的对象(本例中是 Foo.prototype )。

    Bar.prototype = Foo.prototype 并不会创建一个关联到 Bar.prototype 的新对象,它只是让 Bar.prototype 直接引用 Foo.prototype 对象。因此当你执行类似 Bar.prototype.myLabel = ... 的赋值语句时会直接修改 Foo.prototype 对象本身。

    Bar.prototype = new Foo() 的确会创建一个关联到 Bar.prototype 的新对象。但是它使用了 Foo(..)的“构造函数调用”,如果函数 Foo 有一些副作用(比如写日志、修改状态、注册到其他对象、给 this 添加数据属性,等等)的话,就会影响到 Bar() 的“后代”,后果不堪设想。

    结论

    因此,要创建一个合适的关联对象,我们必须使用 Object.create(..) 而不是使用具有副作用的 Foo(..) 。这样做唯一的缺点就是需要创建一个新对象然后把旧对象抛弃掉,不能直接修改已有的默认对象。

  • 相关阅读:
    19-10-31-B
    19-10-30-Night-V
    19-10-30-C
    19-10-29-Night-X
    19-10-29-Z
    19-10-28-A
    19-10-27-S
    19-10-26-Night-D
    留言板
    优秀博客存档
  • 原文地址:https://www.cnblogs.com/fayin/p/7066770.html
Copyright © 2011-2022 走看看