xdliu_just

专注与前端

JavaScript __proto__

__proto__

 

一个对象的__proto__ 属性和自己的内部属性[[Prototype]]指向一个相同的值 (通常称这个值为原型),原型的值可以是一个对象值也可以是null(比如说Object.prototype.__proto__的值就是null).该属性可能会引发一些错误,因为用户可能会不知道该属性的特殊性,而给它赋值,从而改变了这个对象的原型. 如果需要访问一个对象的原型,应该使用方法Object.getPrototypeOf.

 

__proto__ 属性已经被添加在了ES6草案 §B.3.1中.

 

 

语法


 

var proto = obj.__proto__;

注: 两个下划线,后跟五个字符"proto",最后又是两个下划线.

 

描述


 

当一个对象被创建时,它的 __proto__ 属性和内部属性[[Prototype]]指向了相同的对象 (也就是它的构造函数的prototype属性).改变__proto__ 属性的值同时也会改变内部属性[[Prototype]]的值,除非该对象是不可扩展的.

 

例子


 

下面,创建了一个新的Person实例,然后看看它的 __proto__ 属性是否等于它的构造函数的prototype属性.

var Person = function(){

};

var p = new Person();

p.__proto__ === Person.prototype // true

这时, p 继承了 Person, 但是如果给p.__proto__ 赋另外一个对象值,则会改变它的继承对象:

p.__proto__ = Object.prototype

现在,p不在继承于Person.prototype, 而是直接继承了Object.prototype, 也就丢失了所有从Person.prototype继承来的属性.

可是,这只适用于可扩展的 对象,一个不可扩展的对象的 __proto__ 属性是不可变的:

 

var obj = {};

Object.preventExtensions(obj);

obj.__proto__ = {}   //error

 

 

转自:https://developer.mozilla.org/zh-CN/docs/JavaScript/Reference/Global_Objects/Object/proto

 

 

 

 

 














 

 

 

 

posted on 2013-05-24 11:21  xdliu just  阅读(162)  评论(0编辑  收藏  举报

导航