體現對象原型分步式寫法javascript
//原型分步式寫法 //構造函數 function Person(){} //對象原型 Person.prototype.name = 'Avensatr'; Person.prototype.age = '22'; Person.prototype.job = 'Software Engineer'; Person.prototype.sayName = function(){ console.log(this.name); }
我問你答?? 打印結果是??html
var person = new Person(); //__proto__隱式原型與顯式原型Person.prototype console.log(person.__proto__); console.log(Person.prototype); //構造函數(對象原型構造用於構造對象) console.log(Person.prototype.constructor); console.log(Person.prototype.constructor === Person); //構造函數原型 console.log(Person.prototype.constructor.prototype); //對象原型 console.log(Person.prototype.__proto__); //構造函數是由function Function(){}建立 console.log(Person.prototype.constructor.__proto__); console.log(person.__proto__ === Person.prototype);
理清上述(實例與構造原型對象關聯關係)打印結果後,見圖解以下前端
完整圖解應以下java
Person.prototype只是對象指針引用,真正建立對象的是Person.prototype.constructor.prototype 構造函數原型函數
每一個建立一個函數都有prototype屬性,該函數prototype屬性指向一個該函數建立的對象.即 Person.prototype.constructor.prototypethis
實例對象之間經過「__proto_隱式原型」與構造函數原型對象「Person.prototype」之間相關聯 即person.__proto__ === Person.prototypespa
instanceof 用於檢測對象與實例之間關係prototype
person instanceof Person 沿着原型鏈person.__proto__與Person.prototype查找,若兩條線能找到同一個引用,即同一個對象,則返回true,不然返回false設計
體現對象原型封裝的寫法指針
//原型集中寫法 function Person(){} var friends = new Person();//建立一個實例對象 Person.prototype = { name : "Avensatr", age : "22", job : "Software Engineer", sayName : function(){ console.log(this.name); } }
這種面向對象快捷寫法 Person.prototype = {} 與上述對象原型分步式寫法有所區別;本質體如今原型的重寫上
Person.prototype.constrctor 再也不指向 function Person(){} 而指向新的function Object() { [native code] }函數
打印結果以下圖
匿名函數自執行封裝對象原型方法
function Person(){} Person.prototype = (function () { var setName = function (name) { return name; }, setAge = function (age) { return age; }, setJob = function (job) { return job; }; return { setName : setName, setAge : setAge, setJob : setJob } })();
匿名函數自執行與體現對象原型封裝的寫法原理是同樣的,這裏再也不贅述
【資料參考】
http://www.sxrczx.com/docs/js/2305453.html
JavaScript高級程序設計(第三版)