javascript 易错知识点实例小结
本文实例总结了javascript易错知识点。分享给大家供大家参考,具体如下:
原理是这样的,不同的对象在底层都表示为二进制,在JavaScript中二进制前三位都为0的话会被判断为object类型,null的二进制表示是全0,自然前三位也是0,所以执行typeof时会返回“object”。
如myObject.a的属性访问返回值可能是undefined,但是这个值有可能是属性中存储的undefined,也可能是因为属性不存在所以返回undefined。那么如何区分这两种情况呢?
varmyObject={ a:2 }; //方案一 ("a"inmyObject);//true ("b"inmyObject);//false //方案二 myObject.hasOwnProperty("a");//true myObject.hasOwnProperty("b");//false //方案三 Object.prototype.hasOwnProperty.call(myObject,'b')
参考如下代码:
functionFoo(name){ this.name=name; } Foo.prototype.myName=function(){ console.log(this.name) } functionBar(name,label){ Foo.call(this,name); this.label=label; } //方法1 Bar.prototype=Object.create(Foo.prototype) //方法2 Bar.prototype=Foo.prototype; //方法3 Bar.prototype=newFoo(); //Bar.prototype.constructor=Bar; Bar.prototype.sayName=function(){ console.log(this.name) } varb=newFoo('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=newFoo()的确会创建一个关联到Bar.prototype的新对象。但是它使用了Foo(..)的“构造函数调用”,如果函数Foo有一些副作用(比如写日志、修改状态、注册到其他对象、给this添加数据属性,等等)的话,就会影响到Bar()的“后代”,后果不堪设想。
结论
因此,要创建一个合适的关联对象,我们必须使用Object.create(..)而不是使用具有副作用的Foo(..)。这样做唯一的缺点就是需要创建一个新对象然后把旧对象抛弃掉,不能直接修改已有的默认对象。
感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.jb51.net/code/HtmlJsRun测试上述代码运行效果。
更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript错误与调试技巧总结》、《JavaScript传值操作技巧总结》、《javascript编码操作技巧总结》、《JavaScript中json操作技巧总结》、《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript动画特效与技巧汇总》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》
希望本文所述对大家JavaScript程序设计有所帮助。