走进__proto__属性,看ie是否支持它,谁又来给他归宿

每一个引用类型的实例中,都有一个指针,指向其原型对象。这个指针在非IE浏览器里通过__proto__表示,而在IE里不提供。

看如下代码:

obj = {};
obj.__proto__.toString = function() {
     return "__proto__";
 }

var ceshi = {};
alert(ceshi);

输出结果就是__proto__。

原因:JavaScript中只有一个Object原型对象。

     第二行,修改了这个原型对象的toString成员变量,而Object原型对象是所有引用类型实例共享的,只有一个,所以其他对象调用toString()也就发生了变化。

IE不提供这个__proto__,这样就不能获取到Object原型对象,也就无法修改这个上级的属性了。这样做就更安全了。

但是有什么方法可以代替么?

  因为__proto__不是标准方法,标准的方法是Object.getPrototypeOf();

  看如下代码:

var obj = {};
console.log(obj.__proto__);//输出Object {}

//等于

Object.getPrototypeOf(obj);//输出Object {}

  

  

时间: 2024-10-12 16:22:22

走进__proto__属性,看ie是否支持它,谁又来给他归宿的相关文章

简单介绍 javascript 中 __proto__ 属性的原理

在 javascript 中我们会约定俗成,如果一个方法是被 new 出来使用的,那么该方法名首字母通常会大写,例如下面代码块中的 Person.(我们也可以把 Person 看成 java 或 c# 中的类) var Person = function(name) { this.name = name; } 在 javascript 中一个类被 new 出来的具体过程如下: // 初始化一个对象 p var p = new Person(); // 初始化一个对象 p var p = {};

[Effective JavaScript 笔记]第31条:使用Object.getPrototypeOf函数而不要使用__proto__属性

ES5引入Object.getPrototypeOf函数作为获取对象原型的标准API,但由于之前的很多js引擎使用了一个特殊的__proto__属性来达到相同的目的.但有些浏览器并不支持这个__proto__属性,所以并不是完全兼容的.例如对于拥有null原型的对象,不同的环境结果就不同了. var empty=Object.create(null); '__proto__' in empty;//一些环境会返回false,另一些会返回true 这就导致结果的不一致,从而影响到依赖这个判断的相关

__proto__属性

今天来说下这个属性__proto__.之前也看这个属性的介绍,但是上次面试被问到答的不怎么好.今天再巩固一下 这个属性是用来读取或设置当前对象的prototype对象的.目前所有的浏览器都部部署了这个属性. 这个属性前后都有双下划线,说明它本质上是一个内部的属性,而不是一个对外api.但是所有的浏览器都支持,所以被 加入了 es6,但标准也规定了,只有浏览器才部署这个属性.而其它的环境不一定部署这个属性.所以写代码时最好不要用这个属性. 原因已经很清楚了,想实现它的功能可以使用下面的方法 Obj

偷Microsoft师学MFC艺:且看C++如何支持反射

如果你问一个IT人士"C++如何实现类似Java的反射?",结果会怎样呢?~!@#¥%--&*,估计大部分人都会要稍微思考了一下,或者直接说"C++根本就不支持反射的呀!". 是的,C++语言本身是不支持反射的,但实际应用中总是会有将对象序列化的需求,总不可能C++不支持,我们就不用C++了,既然发明C++的大师们没有考虑这个,那我们只有自己动手了,毛主席说过"自己动手,丰衣足食"! 天生限制 C++语言本身不支持反射机制,但C++对象总

怎么看主机是否支持虚拟化

securable下载这个工具: 第一项是检测处理器是否支持64位拓展技术:第二项是检测处理器是否支持硬件数据执行保护(DEP),能够在内存上执行额外检查以帮助防止在系统上运行恶意代码:第三项是检测是否支持虚拟化. 虚拟化的几种状态的含义-No--CPU不支持虚拟化YES--CPU支持虚拟化Locked on--CPU支持虚拟化,但虚拟化的开启由BIOS控制,现在已开启Locked off--CPU支持虚拟化,但虚拟化的开启由BIOS控制,现在未开启其实显示Locked on/off和YES还有

十个实用但IE不支持的CSS属性

对IE浏览器尤其是IE6的抱怨基本已进入麻痹状态,偶尔甚至产生非常消极的想法:这个世界只有一个浏览器就好了,哪怕这唯一的浏览器就是IE6.当然,这样的想法是非常病态的,马上打消.本文里面,介绍了10个很实但IE却不支持的CSS属性,列出这些属性并不是为了数落IE(数落也没用),而是你了解了哪些CSS属性是IE不支持的,就更有针对性的去编写CSS和Hack了. 1. Outline 在调试CSS问题的时候,我常常在指定元素上添加border来精确的查看该元素会发生什么并帮助确定问题的来源.这常常是

H5、CSS3属性的支持性以及flex

一.项目中用到一个flex属性,但是应用了flex的父容器只设置了width,没有设置height,此时每一个应用了上面提到的属性的样式的div都重叠在了一起,在IE10,IE11出问题,IE9没有问题.(待深入研究) 二.距离上一次发布<五大主流浏览器 HTML5 和 CSS3 兼容性大比拼>转眼已过去一年,在这一年里,浏览器领域的竞争愈演愈烈.Firefox 成为新的“版本帝”但依然未能摆脱被 Chrome 超越的命运,支持更多标准的 IE10 将随着 Windows 8 在10月底正式发

js中__proto__, property, prototype, 对象自身属性方法和原型中的属性方法的区别

__proto__: 这个属性是实例对象的属性,每个实例对象都有一个__proto__属性,这个属性指向实例化该实例的构造函数的原型对象(prototype). proterty:这个方法是对象的属性.(据说和一个对象的attr类似,比如dom对象中) prototype:每个构造函数都有一个prototype对象,这个对象指向该构造函数的原型. 对象自身属性方法和原型中的属性方法的区别: 对象自身的属性和方法只对该对象有效,而原型链中的属性方法对所有实例有效. 例子: function bas

html5属性placeholder的js 向下兼容支持(jquery版)

placeholder是html5表单特性中比较好用的一条,但是苦于其向下兼容性,所以一般要做向下兼容的站点都不敢用,如果有用到的地方,也是用js简单模拟而实现的,那么有没有一个一劳永逸的方法去解决这个问题呢? 接下来我就来带大家实现这个方案: if ('placeholder' in document.createElement('input')) return; 这句代码的意思是判断是否是支持placeholder属性的,如果支持则return,不执行下面代码. if (this.type