1.每個函數數據類型(函數,全部的類)天生都有一個prototype(原型)屬性,裏面存儲的是公有的屬性和方法,並且這個屬性是一個對象數據類型的,瀏覽器就會給他開闢一個堆內存,開闢的這個堆內存中也有一個天生自帶的屬性叫constructor,並且指向的是這個類的自己.
2.全部的對象數據類型(除了函數和基本數據類型,其餘的都是,實例,prototype是對象數據類型)天生自帶一屬性個叫_ _ protot _ _,指向所屬類型的原型.
3.全部的類都是函數數據類型的,Object是一個類,說明Object是函數數據類型的.他就是函數Function類的一個實例面試
[注意!]實例都是對象,prototype也是個對象Object是基類,他的原型上面沒有_ _proto_ _ 實例經過this獲得的是私有屬性和方法,還能夠繼承所屬類的公有屬性和方法,好比說,每一個數組均可以用sort這個方法,這個方法是在類Array原型上,由於全部的數組都是這個Array類一個具體的實例,因此只要是數組就能夠用,實例能夠獲得公有類的方法
Array.prototype.removeRepeat=function(){ //this 就是那個具體的數組實例 for(var i=0;i<this.length;i++){ if(this.indexOf(this[i])!==this.lastIndexOf(this[i])){ this.spalice(i,1); i--; } }return this } var ary=[1,2,3,1,3,4,53,3,2,1]; cosole.log(ary.removeRepeat().sort().splice(0,1,"a"));
===========小練習======================
思考做業,模擬數組slice方法,在數組原形上增長方法數組
======================================瀏覽器
面試題
1.用面向對象的思想擴展方法-->基於內置類的原型擴展方法.
2.鏈式寫法實現的原理 (return this)
3.談談你對原型的理解函數
==================================this
實例.屬性名,遇到屬性名先看是否是本身的私有屬性,若是是的話就用私有的,不是的話,經過實例的_ _ proto _ _ 找到所屬的原型(prototype)尚未的話,經過所屬類的prototype的 _ proto _繼續找,一直找到基類Object的prototypespa
=========題==========prototype
Object.prototype.x = 10; Object.prototype.y = 20; Object.prototype.sum = function() { console.log(this.x + this.y) }; function Fn() { this.x = 100; this.y = 200; this.sum = function() { console.log(this.x + this.y) } } Fn.prototype.sum = function() { console.log(this.x + this.y); } Fn.prototype.x = 1;cou Fn.prototype.y = 2; var f1 = new Fn; var f2 = new Fn; Fn.prototype.sum(); f1.__proto__.__proto__.sum(); Fn.prototype.__proto__.sum(); f1.__proto__.sum==f2.__proto__.__proto__.sum f1.__proto__.sum==Fn.prototype.sum f1.__proto__.sum==Fn.prototype.__proto__.sum f1.__proto__.__proto__.sum==Fn.prototype.__proto__.sum Object.prototype.sum==Object.prototype.sum
=============有趣的東西==============code
//caller:檢驗函數被誰調用過 function Fn() { console.log(arguments.callee.caller); console.log(Fn.prototype.constructor === arguments.callee); } function fn() { Fn() } fn(); function sum(n) { console.log(arguments.callee===arguments.callee.caller); if(n<=0){ return 0 } return n+sum(--n); } console.log(sum(10)); </script>