首先 对象才会有__proto__,函数(为了命名规范,所有函数首字母都是大写,那用这一规范来说的话,粗暴的理解为首字母大写的才会有哦prototype)才会有prototype;
比如(1).__proro__===Number.protype,({}).__proto__===Object.prototype
var Factory= function(){} 那么Factory.__proto__===Function.prototype;
var obj={};
obj.__proto__===Object.prototype;
Number.__proto__===Function.prototype或者String.__proto__===Function.prototype 等;
此处省略1万字
Function.prototype.__proto__===Object.prototype 这个说明函数也是对象的实例
于是继续
Number.__proto__.__proto__===Object.prototype
那么假如 var Person=function(){
};
为什么要这样写?为什么仅仅是通过 new Person()创建的对象才会有tell方法?
Person.prototype.tell===function(){
console.log('tell');
}
var person=new Person();
person.__proto__===Person.prototype;//true
那么 自然就不会有person.__proto__!==Object.prototype //true
其实真正是这样的 Person.prototype.__proto__===Object.prototype;
于是 可以得出 person.__proto__.__proto__===Object.prototype;
于是 还可以得出 通过对象字面量创建的对象和通过构建函数创建的对象不一样。
从此原型是路人。
(Object.create(proto, [ propertiesObject ]))
那么如果以上搞懂了,分分钟get以下代码:
Function.prototype.method = function(name, fn) {
if (!this.prototype[name]) {
this.prototype[name] = fn;//保证每一个对象都要有相应的方法。
}
return this;
}