一. 在JavaScript中,一切皆對象,每個對象都有一個原型對象(prototype),而指向該原型對象的內部指針則是__proto__。當我們對對象進行for in 或者for of遍歷時,就會通過__proto__依次遍歷對象關聯的所有對象。這就是原型鏈,遍歷所有對象的父對象直到object ...
一. 在JavaScript中,一切皆對象,每個對象都有一個原型對象(prototype),而指向該原型對象的內部指針則是__proto__。當我們對對象進行for in 或者for of遍歷時,就會通過__proto__依次遍歷對象關聯的所有對象。這就是原型鏈,遍歷所有對象的父對象直到object直至null。
function Person(name,work){ this.name = name; this.work = work; } Person.prototype.show = function(){ console.log(this.name); } var person = new Person('nicknailo','全棧開發'); console.log(person.__proto__ === Person.prototype); //true
console.log(Person.prototype.__proto__);//Object 或者{}
console.log(person.__proto__.__proto__.__proto__);//null
console.log(Person.prototype);//Person { show: [Function] }
person對象的原型指向 Person.prototype,Person.prototype指向object,object 指向 null。蘊含了一個哲理,無中生有。
二.
這是一張描述了Object、Function以及一個函數實例Foo他們之間原型之間聯繫。如果理解了上面的概念,這張圖是不難讀懂。
Function.prototype.proto 指向了 Object.prototype,這說明Function.prototype 是一個 Object實例,那麼應當是先有的Object再有Function。
但是Object.prototype.constructor.proto 又指向了 Function.prototype。這樣看來,沒有Function,Object也不能創建實例。
三.Person.prototype只是對象的原型上(constructor)擴展的屬性。
var animal = function(){}; var dog = function(){}; animal.price = 2000; dog.prototype = animal; var tidy = new dog(); console.log(dog.price + " : dog.price");//undefined : dog.price console.log(tidy.price + " : tidy.price"); //2000 : tidy.price
上述代碼可以看出來,實例tidy只與原型對象dog.prototype存在關聯,上面的代碼可以看成是 dog.prototype.price = 2000;