[ 做者: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: