重學前端是程劭非(winter)在極客時間開的一個專欄,在此主要整理個人學習筆記。若有侵權,請聯繫我,謝謝。前端
js提供內置函數,來訪問和操縱原型bash
var cat = {
say(){
console.log("meow~");
},
jump(){
console.log("jump");
}
}
var tiger = Object.create(cat, {
say:{
writable:true,
configurable:true,
enumerable:true,
value:function(){
console.log("roar!");
}
}
})
var anotherCat = Object.create(cat);
anotherCat.say();
var anotherTiger = Object.create(tiger);
anotherTiger.say();
複製代碼
(待補充)函數
new運算一個構造器和一組參數,實際作了這三件事學習
new操做讓函數對象在語法上跟類類似,可是,它提供了兩種方式,一種是在構造器添加屬性,一種是經過構造器的prototype屬性添加屬性ui
// 經過構造器
function c1(){
this.p1 = 1;
this.p2 = function(){
console.log(this.p1);
}
}
var o1 = new c1;
o1.p2();
// 經過構造器的原型
function c2(){
}
c2.prototype.p1 = 1;
c2.prototype.p2 = function(){
console.log(this.p1);
}
var o2 = new c2;
o2.p2();
複製代碼
用new來實現一個Object。create的不完整polyfillthis
Object.create = function(prototype){
var cls = function(){}
cls.prototype = prototype;
return new cls;
}
複製代碼
這段代碼建立了一個空函數做爲類,並把傳入的原型掛在了它的prototype,最後建立了一個它的實例,根據 new 的的行爲,這將產生一個以傳入的第一個參數爲原型的對象。spa
類的基本寫法prototype
class Rectangle {
constructor(height, width) {
this.height = height;
this.width = width;
}
// Getter
get area() {
return this.calcArea();
}
// Method
calcArea() {
return this.height * this.width;
}
}
複製代碼
經過get/set來建立getter,經過括號和大括號來建立方法,數據型成員寫在構造器裏。設計
類提供了繼承能力code
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(this.name + ' makes a noise.');
}
}
class Dog extends Animal {
constructor(name) {
super(name); // call the super class constructor and pass in the name parameter
}
speak() {
console.log(this.name + ' barks.');
}
}
let d = new Dog('Mitzie');
d.speak(); // Mitzie barks.
複製代碼
比起早期的原型模擬方式,使用 extends 關鍵字自動設置了 constructor,而且會自動調用父類的構造函數,這是一種更少坑的設計。