1
0
mirror of https://github.com/ruanyf/es6tutorial.git synced 2025-05-24 18:32:22 +00:00

edit object/__proto__

This commit is contained in:
ruanyf 2015-09-20 13:11:46 +08:00
parent 9971d06926
commit e509bec9f2
2 changed files with 39 additions and 6 deletions

View File

@ -335,25 +335,57 @@ function processContent(options) {
**1__proto__属性** **1__proto__属性**
__proto__属性用来读取或设置当前对象的prototype对象。该属性一度被正式写入ES6草案但后来又被移除。目前所有浏览器包括IE11都部署了这个属性。 `__proto__`属性(前后各两个下划线),用来读取或设置当前对象的`prototype`对象。目前所有浏览器包括IE11都部署了这个属性。
```javascript ```javascript
// es6的写法 // es6的写法
var obj = { var obj = {
__proto__: someOtherObj,
method: function() { ... } method: function() { ... }
} }
obj.__proto__ = someOtherObj;
// es5的写法 // es5的写法
var obj = Object.create(someOtherObj); var obj = Object.create(someOtherObj);
obj.method = function() { ... } obj.method = function() { ... }
``` ```
有了这个属性实际上已经不需要通过Object.create()来生成新对象了 该属性没有写入ES6的正文而是写入了附录原因是`__proto__`前后的双引号说明它本质上是一个内部属性而不是一个正式的对外的API只是由于浏览器广泛支持才被加入了ES6。标准明确规定只有浏览器必须部署这个属性其他运行环境不一定需要部署而且新的代码最好认为这个属性是不存在的。因此无论从语义的角度还是从兼容性的角度都不要使用这个属性而是使用下面的`Object.setPrototypeOf()`(写操作)、`Object.getPrototypeOf()`(读操作)、`Object.create()`(生成操作)代替
由于`__proto__`前后的双引号看上去很像内部属性而不像一个正式的对外的API所以从语义角度考虑最好不要使用这个属性而是下面的`Object.setPrototypeOf()``Object.getPrototypeOf()`代替。 在实现上,`__proto__`调用的是`Object.prototype.__proto__`,具体实现如下。
```javascript
Object.defineProperty(Object.prototype, '__proto__', {
get() {
let _thisObj = Object(this);
return Object.getPrototypeOf(_thisObj);
},
set(proto) {
if (this === undefined || this === null) {
throw new TypeError();
}
if (!isObject(this)) {
return undefined;
}
if (!isObject(proto)) {
return undefined;
}
let status = Reflect.setPrototypeOf(this, proto);
if (! status) {
throw new TypeError();
}
},
});
function isObject(value) {
return Object(value) === value;
}
```
如果一个对象本身部署了`__proto__`属性,则该属性的值就是对象的原型。
```javascript
Object.getPrototypeOf({ __proto__: null })
// null
```
**2Object.setPrototypeOf()** **2Object.setPrototypeOf()**

View File

@ -72,6 +72,7 @@
- Addy Osmani, [Data-binding Revolutions with Object.observe()](http://www.html5rocks.com/en/tutorials/es7/observe/): 介绍Object.observe()的概念 - Addy Osmani, [Data-binding Revolutions with Object.observe()](http://www.html5rocks.com/en/tutorials/es7/observe/): 介绍Object.observe()的概念
- Sella Rafaeli, [Native JavaScript Data-Binding](http://www.sellarafaeli.com/blog/native_javascript_data_binding): 如何使用Object.observe方法实现数据对象与DOM对象的双向绑定 - Sella Rafaeli, [Native JavaScript Data-Binding](http://www.sellarafaeli.com/blog/native_javascript_data_binding): 如何使用Object.observe方法实现数据对象与DOM对象的双向绑定
- Axel Rauschmayer, [`__proto__` in ECMAScript 6](http://www.2ality.com/2015/09/proto-es6.html)
## Proxy和Reflect ## Proxy和Reflect