1.基本類型不是對象(boolean、undefined、number、string) 2.引用類型都是對象(Array,function ,Object) 3.對象是經過函數建立,而且強調,對象字面量也是經過函數建立,舉例說明,ES6繼承的語法糖 4.函數有的是顯式原型prototype 5.對象有的是隱式原型__proto__ 和構造器 constructor 6.可是因爲JS中函數也是一種對象,因此函數也擁有__proto__和constructor 7.__proto__ 屬性,它是對象所獨有的,能夠看到__proto__屬性都是由一個對象指向一個對象. 它的做用就是當訪問一個對象的屬性時,若是該對象內部不存在這個屬性,那麼就會去它的__proto__屬性所指向的那個對象(能夠理解爲父對象)裏找,若是父對象也不存在這個屬性,則繼續往父對象的__proto__屬性所指向的那個對象(能夠理解爲爺爺對象)裏找,若是還沒找到,則繼續往上找…直到原型鏈頂端null(能夠理解爲原始人。。。),再往上找就至關於在null上取值,會報錯(能夠理解爲,再往上就已經不是「人」的範疇了,找不到了,到此結束。 8.prototype屬性,它是函數所獨有的,它是從一個函數指向一個對象。它的含義是函數的原型對象,也就是這個函數(其實全部函數均可以做爲構造函數)所建立的實例的原型對象,它的做用就是包含能夠由特定類型的全部實例共享的屬性和方法,也就是讓該函數所實例化的對象們均可以找到公用的屬性和方法。任何函數在建立的時候,其實會默認同時建立該函數的prototype對象。 8.constructor屬性也是對象才擁有的,它是從一個對象指向一個函數,含義就是指向該對象的構造函數,每一個對象都有構造函數(自己擁有或繼承而來,繼承而來的要結合__proto__屬性查看會更清楚點 舉慄: class Person { constructor(name) { this.name = name; } } var xiaoming = new Person('張三'); console.log(xiaoming); 輸出結果: Person {name: "張三"} name: "張三" __proto__: Object __proto__就是由xiaoming(實例對象)指向Person 對象。 舉慄: console.log(xiaoming.__proto__); 輸出結果: {constructor: ƒ} constructor: ƒ Person(name) arguments: (...) caller: (...) length: 1 name: "Person" prototype: {constructor: ƒ} __proto__: ƒ () [[FunctionLocation]]: index.vue?0dbc:133 [[Scopes]]: Scopes[3] __proto__: Object 裏面的構造器指向的是Person裏面的構造函數,由於是函數,因此有prototype(顯式原型) 舉慄: console.log(xiaoming.__proto__.__proto__); 輸出的是: {constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ, …} constructor: ƒ Object() hasOwnProperty: ƒ hasOwnProperty() isPrototypeOf: ƒ isPrototypeOf() propertyIsEnumerable: ƒ propertyIsEnumerable() toLocaleString: ƒ toLocaleString() toString: ƒ toString() valueOf: ƒ valueOf() __defineGetter__: ƒ __defineGetter__() __defineSetter__: ƒ __defineSetter__() __lookupGetter__: ƒ __lookupGetter__() __lookupSetter__: ƒ __lookupSetter__() get __proto__: ƒ __proto__() set __proto__: ƒ __proto__() 尋找構造函數的原型,由於函數也是一個引用類型,因此構造函數指向Object對象 舉慄: console.log(xiaoming.__proto__.__proto__.__proto__); 已無隱式原型,內存地址指向空對象指針,輸出null