javascript: prototype

[ 做者:byeyear    Email:east3@163.com    轉載請註明 ]javascript

古希臘有哲學家認爲,在那遙遠的虛無之處,人類目光所不能及的地方,有一匹原型馬,世間萬馬皆依此而生。咱們有構造函數horse()用於從原型馬構造一匹咱們能看到、觸摸到、騎到的馬:java

function horse()
{
// 這裏的this指用構造函數建立的實例對象
// 例如,如有var myHorse = new horse();
// 那麼這裏的this即實例對象myHorse
// 而原型馬可稱爲原型對象
this.color = 'red'; this.height = 80; this.length = 160; }
// Now, if you want, you can construct your own horse.
// var myHorse = new horse();

能夠經過構造函數的prototype屬性訪問原型馬:ide

(也只有構造函數纔有prototype屬性)函數

console.log(horse.prototype);

咱們的實例馬源自原型馬:this

var myHorse = new horse();、
// 馬的起源 myHorse.__proto__
=== horse.prototype; // true

老子說過,一輩子二,二生三,三生萬物。咱們的原型馬源自Object:spa

console.log(horse.prototype.__proto__);
>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__()

在原型立刻新定義的方法可被早先構建的現實馬所用:prototype

var myHorse = new horse();
horse.prototype.run = function() {alert('I am running.'); }
myHorse.run();

 咱們的馬可騎,有本身的名字,黑色,這些是在原型馬的構造函數裏設置的可配置屬性:code

myHorse.color = 'black';
myHorse.name = 'Lili';
myHorse.ride = function() { alert('Ride me.'); }

不一樣的實例馬能夠有各自不一樣的color、name、ride(屬性和方法)。對象

然而不一樣的實例馬也須要共享相同的屬性和方法(好比上面的run和下面的legs),放在horse.prototype裏:blog

horse.prototype.legs=4;
// myHorse.__proto__.legs === 4

原型馬的運行自有其內在機理,那是不能被凡人所理解的奧祕(?):

// myHorse沒法調用secret()函數
horse.secret = function() { alert('This is a secret.'); }

 構造函數與prototype構成雙向鏈表:

horse.prototype.constructor === horse;

 函數也是一種對象,因此也有其__proto__:

horse.__proto__ === Function.prototype;    // true

 Function是javascript內置函數對象,全部函數對象源自於她,她本身源自於她本身,她的prototype源自Object:

Function.__proto__ === Function.prototype;    // true
Function.prototype.__proto__ === Object.prototype;    //true

Object.prototype是原型鏈的盡頭:

Object.prototype.__proto__ === null;    // true

然而Object是個函數對象,因此它源自Function:

Object.__proto__ === Function.prototype;    // true

總結:

Object.prototype是萬物的盡頭,在那裏,沒有時間,無限緻密;

祂說,要有函數,Function.prototype源自Object.prototype;

爾後,咱們有了源自Function.prototype的Function和Object。

因此,儘管咱們寫下Object.prototype,但並不意味着先有Object後有.prototype;

偏偏相反,Object.prototype纔是萬物的始祖錒。

下面的神圖來自http://www.mollypages.org/tutorials/js.mp

相關文章
相關標籤/搜索