Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

低版本IE中的独立对象

  在现代浏览器中,只要在Object的prototype对象上添加属性,几乎所有对象都可以用上我们添加的属性,因为规范建议所有对象都从Object继承下来。但是低版本IE是不规范的产物,在低版本IE中几乎所有非原生JavaScript对象都不继承于Object。
<script>
Object.prototype.append=function(e){
  this.insertAdjacentHTML("beforeend",e);
};
onload=function(){
  document.body.append("<strong>次碳酸钴</strong>");
};
</script>

  我们给Object的prototype添加的方法在现代浏览器中可以直接从HTML元素上调用(但是这么做不环保,我是不提倡的),因为现代浏览器中的HTML元素是继承于Object的,只是原型链有点长而已。我们可以在Chrome的控制台中很容易的把整个原型链条读取出来。
  由于低版本IE的非JavaScript原生对象是独立实现的,它们不继承于Object,所以无法访问Object的原型上的函数。因此上面的测试在IE8-中报错了。但即便它们是独立实现的,也模拟了Object实现了toString之类的方法(没有实现valueOf)。
<script>
onload=function(){
  console.log(document.body instanceof Object);
  console.log("valueOf" in document.body);
  console.log(document.body.toString());
};
</script>

  顺便提一下,现代浏览器中也可以通过“__proto__”来让对象不继承于Object。 <script>
//使用Chrome或Firefox测试(IE尚未实现__proto__)
var o={__proto__:null};
console.log(o instanceof Object); //false
</script>
  不继承于Object的对象只是无法使用Object提供的一些列方法而已。我们依然可以操作对象的属性,把它当做一个普通的hash对象来用。不过这么做没有任何优点,至少目前我还没发现。
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^