function Foo () { this.name = "name" this.age = 18 } Foo.prototype.sayHi = function () { console.log('hello') } var foo = new Foo() foo.name // name foo.age // 18 foo.sayHi() // hello
每一個構造函數都有一個prototype
屬性,這個屬性指向原型對象
,使用構造函數建立實例對象後,這個prototype
指向的原型對象就是實例的原型對象.prototype 是函數纔會有的屬性
git
除了 null 以外,每一個對象都擁有一個隱藏的__proto__
屬性,指向實例的原型對象.能夠用 foo.__proto__
或者 Object.getPrototypeOf(foo)
來訪問.github
實際上構造函數的prototype
屬性與實例對象的__proto__
屬性指向的是同一個原型對象.函數
foo.__proto__ === Foo.prototype // true
每一個原型對象都有一個constructor
屬性指向關聯的構造函數post
Foo.prototype.constructor === Foo // true
每一個對象都會從原型繼承屬性this
根據所述可繪製:spa
function Foo () {} Foo.prototype.name = "Ann" var foo = new Foo() foo.name = "ken" console.log(foo.name) // Ken delete foo.name console.log(foo.name) // Ann
當讀取實例對象的屬性時,先在實例對象中查找,若是找不到,就會到實例關聯的原型對象
中去找,若是原型對象中找不到,就到原型的原型對象
中找,一直到最頂層爲止..net
原型也是一個對象
,那麼就能夠使用最原始的方法建立:prototype
var obj = new Object() obj.name = "Ann" console.log(obj.name) // Ann
原型對象就是經過 Object 構造函數建立出來的,那麼原型對象就能夠經過__proto__屬性訪問到:
3d
Object.prototype 的原型是什麼呢? 答案是 null
,null 表示沒有對象,此處不該該有值
code
console.log(Object.prototype.__proto__ ) // null
那是什麼建立了 Object()這個構造函數呢?
看圖:
原型鏈就是圖中的藍色關聯