原文:javascript
1.深刻理解javascript原型和闭包——prototype原型html
2.三张图搞懂JavaScript的原型对象与原型链java
打开浏览器控制台,任意定义一个对象,打印出来后,会发现有最后必定有一个默认属性 “__proto__”,这是 js 的设计思路,相似于 java 中的继承。浏览器
注意:在本章中严格区分函数与对象闭包
prototype 与 __proto__
函数
1.区别post
var a = {}; console.log(a.prototype); //undefined console.log(a.__proto__); //Object {} var b = function(){} console.log(b.prototype); //b {} console.log(b.__proto__); //function() {}
2.__proto__ 指向谁?ui
/*一、字面量方式*/ var a = {}; console.log(a.__proto__); //Object {} console.log(a.__proto__ === a.constructor.prototype); //true /*二、构造器方式*/ var A = function(){}; var a = new A(); console.log(a.__proto__); //A {} console.log(a.__proto__ === a.constructor.prototype); //true /*三、Object.create()方式*/ var a1 = {a:1} var a2 = Object.create(a1); console.log(a2.__proto__); //Object {a: 1} console.log(a.__proto__ === a.constructor.prototype); //false(此处即为图1中的例外状况)
3.原型链url
var A = function(){}; var a = new A(); console.log(a.__proto__); //A {}(即构造器function A 的原型对象) console.log(a.__proto__.__proto__); //Object {}(即构造器function Object 的原型对象) console.log(a.__proto__.__proto__.__proto__); //null
prototype 属性
spa
这个prototype的属性值是一个对象(属性的集合),默认的只有一个叫作 constructor 的属性,指向这个函数自己。以下图:
原型既然做为对象,属性的集合,不可能就只弄个constructor来玩玩,确定能够自定义的增长许多属性。例如 Object 这个函数,该函数的prototype里面,就有好几个其余属性。
以上是 Object 的原型示意。
那么,咱们本身定义的函数/对象中,可不能够进行自定义内? 答案: 能够。
function Fn() { } Fn.prototype.name = '王福朋'; Fn.prototype.getYear = function () { return 1988; };
这样作的意义在哪?
function Fn() { } Fn.prototype.name = '王福朋'; Fn.prototype.getYear = function () { return 1988; }; var fn = new Fn(); console.log(fn.name); // 王福朋 console.log(fn.getYear()); // 1988
首先,定义了个空的 Fn 函数;
接着,自定义 Fn.prototype 属性;
其次,fn 对象是从 Fn 函数中 new 出来的;
由于每一个对象都有一个隐藏的属性——“__proto__”,这个属性引用了建立这个对象的函数的prototype(注意区分对象和函数)。即:fn.__proto__ === Fn.prototype
结论:每一个对象都有一个隐藏的属性——“__proto__”,这个属性引用了建立这个对象的函数的prototype(注意区分对象和函数)。