一、面向對象特色:封裝、繼承、多態。
二、構造函數 = 構造器 + 原型對象;
(1)父類
function UserClass(name,age,word){app
//構造器 constructor this.name=name; this.age =age; this.word =word; this.init =function(){ return `${this.name} ----init初始化`; }
}
UserClass.prototype={函數
//原型對象 prototype 只能實例化以後才能調取 say(){ return `${this.name}---${this.age}----${this.word}`; }
}
module.exports = UserClass;ui
var u1 = new UserClass("大雷",18,"大家這些二傻子");
打印:大家這些二傻子 -- 大雷 -- init初始化this
(2)子類
繼承父類:call/apply 改變this指向來實現繼承,二者參數不相同,功能相同。但沒法繼承原型對象。
var UserClass=require("./userClass");
function User(name,age,word,grade){prototype
this.grade=grade; //UserClass.call(this,name,age,word); UserClass.apply(this,[name,age,word]);
}code
//(1)直接賦值:能夠繼承原型對象
//User.prototype = new UserClass();
//(2)對象複製:能夠繼承原型對象
//for(var i in UserClass.prototype){
// User.prototype[i] = UserClass.prototype[i];
// }對象
User.prototype={繼承
say(){ //把父類的say方法改寫叫方法重載。 return `${this.name} 說:我好累`; }, walk(){ //添加屬於本身的方法叫多態。 return "i am fly"; }
}
module.exports = User;ip
var u2 = new User("小明",22,"不存在的啊",100);原型鏈
補充知識點:
var person = {
username: "人類", say: function () { alert(this.username + "你好");
}
}
var yellowPerson = {
__proto__: person, username: "黃種人",
};
(1)Object.prototype.username = "地球人";//能夠使用大寫的Object來實現繼承
(2)yellowPerson.constructor.prototype === Object.prototype 結果爲true
注意:yellowPerson.prototype.username = "地球人"; 普通對象不能使用原型來繼承
打印: yellowPerson.say();
普通函數的繼承call和apply:
<script>
window.username = "lili"; var person = { username: "leson" function say(userage,hobby) { alert(this.username + "今年" + userage + "歲喜歡"+hobby); } say.call(person, 18,"籃球");//say裏面的this 指向call裏面的第一個參數
</script>
<script>
window.username = "lili"; var person = { username: "leson" } function say(userage,hobby) { alert(this.username + "今年"+userage+"歲喜歡"+hobby); } say.apply(person,[18,"籃球"]);//say裏面的this 指向apply裏面的第一個參數
</script>
構造函數:使用的時候用new關鍵字實例化的函數
(一、構造函數就是一個類(object) 能夠有屬性和方法 裏面的this就指向該構造函數
二、構造函數能夠經過prototype來實現繼承(補充自身擴展更多內容)
三、繼承的時候就會產生原型鏈 自身-原型-Object Object沒有就是undefined Object就是原型鏈的末端)
this的指向問題:函數屬於誰就指向誰
1 window 當函數直接調用的時候 函數名前面什麼都沒有的時候 say();
2 object 指向函數的全部者 btn.onclick = function(){ }
3 構造函數 new Say() this就指向構造函數
4 call/apply裏面的第一個參數
三種繼承方式:構造函數 使用原型普通對象 使用內部原型普通函數 使用call/apply