1.原型函數的理解圖
2.聲明一個函數就會自動創建一個prototype屬性,這個屬性指向這個函數的原型對象,
而這個函數的原型的對象默認有個constructor屬性,指向最初創建的函數
3.原型函數的變形
-
一般形式
function Person(){ } Person.prototype.name = "Tom"; Person.prototype.speak = function(){ console.log("abc"); } var p1 = new Person(); console.log(Person.prototype.constructor === Person); //true console.log(p1.__proto__ === Person.prototype); //true console.log(p1.hasOwnProperty("name")); console.log(p1.hasOwnProperty("age")); console.log("sex" in p1);
-
判斷對象的屬性位置
function position(obj,proName){ if(obj.hasOwnProperty(proName)){ return "在對象上"; }else if(proName in obj){ return "在原型上"; }else{ return "不存在"; } } console.log(position(p1,"name")); console.log(position(p1,"age")); console.log(position(p1,"sex"));
-
組合模型,解決原型的方法共用問題
function Person(name,age){ this.name = name; this.age = age; } Person.prototype.speak = function(){ console.log(this.name); } var p1 = new Person("Tom",22); var p2 = new Person("Rose",20); console.log(p1.speak());
-
動態原型
function Person(name,age){ this.name = name; this.age = age; // 避免每次創建一個對象時重新創建這個方法覆蓋之前的方法 if(!Person.prototype.eat){ Person.prototype.eat = function(){ console.log(this.name); } } if(!Person.prototype.speak){ Person.prototype.speak = function(){ console.log(this.age); } } } var p1 = new Person("Tom",22); var p2 = new Person("Rose",23); console.log(p1.eat == p2.eat);
-
更換原型
function Person(opt){ this._init(opt); } Person.prototype = { _init : function(opt){ this.name = opt.name; this.age = opt.age; this.sex = opt.sex; }, eat : function(){ }, speak : function(){ } } var p1 = new Person({ name : "Tom", age : 22, sex : "男" }); var p2 = new Person({ name : "Tim", age : 21, sex : "女" });