目錄 (づ ̄ 3 ̄)づ=>
[TOC]
---
>[info] ## Object.assign(target,obj1,obj2);
以上方法為淺復制
>[info] ## Object.create(proto,propertiesObject);
create方法返回一個新對象,這個新對象的prototype為create方法的第一個參數。
create方法的第二個參數是對返回的這個新對象的屬性一些描述配置,可設置可讀可枚舉神馬的
>[warning] **詳見:** [屬性描述符](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty)
```
//繼承
Child.prototype = Object.create(Parent.prototype) //實現是類似于下面的create方法
function create(proto){
function Fn(){}
Fn.prototype = proto;
return new Fn();
}
```
**注意:** 此方法并沒有順道改變prototype中的constructor屬性,導致繼承對象的constructor指向的是被繼承對象的構造函數,需要修正
>[info] ## Object.setPrototypeOf(obj,newPrototype);
**推薦的繼承方法,因為不會誤改prototype中的constructor**
```
Child.prototype.__proto__ = Parent.prototype;
//和Object.setPrototypeOf(Child,Parent.prototype)等效
```

**__proto__**指向大的是new出該對象的構造函數下的原型

>[danger] function是Function的原型,它的情況比較特殊,一般的原型都應為Object類型而它是function,且Function的原型鏈指向的是function,這意味著什么呢?一般情況下,一個對象下的原型鏈指向的是new出這個對象的構造函數下的原型,function是Function下的原型,這意味著Function自己new出了自己,換句話說Function就到頭了!但是,function卻還可查,它的原型鏈指向Object 意味著是 function Object new出來的。然而這個function Object的原型鏈指向的確是function!!
**故源頭兩個一個Function構造函數對象,一個Object原型對象**

>[info] ## Object.prototype.toString;
**多用來精確判斷一個數據類型**
- Object.prototype.toString.call([])==='[object Array]'
- Object.prototype.toString.call('')==='[object String]'
- Object.prototype.toString.call({})==='[object Object]'
**注意:**
object的tostring追述到Object對象下原型的方法。
而其它系統對象,例如數組的tostring方法追述到數組對象下的tostring方法。
另外調用系統對象下的,例如[].tostring,輸出是數組中的數組成員串起來的一串字符串,''.tostring就是本身那串字符串,而{}.tostring因為調用的是原型鏈上Object.prototype.tostring,故輸出為'[object Object]'。
>[info] ## Object.keys();
如果是一個數組,則返回數組索引的集合;
如果是一個對象,則返回對象鍵名的集合。
>[info] ## NodeJS中的inherit
```
let util = require('util');
let EventEmitter = require('events');
util.inherits(Child,EventEmitter)
//上面的繼承等于// console.log(Child.prototype.__proto__===EventEmitter.prototype) //true
let c = new Child();
c.on('a',function(){
console.log(this===c); //true //this調用正常
})
c.emit('a')
```