話很少說,直接開始正題吧.今天就是JavaScript基礎篇第二部分 - 原型和原型鏈javascript
原文地址: 一名【合格】前端工程師的自檢清單前端
JavaScript
中的原型規則是指原型實例指向建立對象的種類,並經過拷貝這些原型建立新的對象,是一種用來建立對象的模式,也就是建立一個對象做爲另外一個對象的prototype
屬性。java
_proto_
屬性(隱式原型),屬性值是一個普通對象;obj.proto === Object.prototype
)_proto_
(即它的構造函數的prototype)中去尋找;instanceof
的底層實現原理,手動實現一個instanceof
instanceof
的底層實現原理:es6
我我的理解是從當前引用的proto
一層一層順着原型鏈往上找,可否找到對應的prototype
。找到了就返回true
設計模式
手動實現: 如下這段代碼應該是最基礎的instanceof
的實現代碼了數組
function instance_of(L, R) {//L 表示左表達式,R 表示右表達式
var O = R.prototype; // 取 R 的顯示原型
L = L.__proto__; // 取 L 的隱式原型
while (true) {
if (L === null)
return false;
if (O === L) // 當 O 顯式原型 嚴格等於 L隱式原型 時,返回true
return true;
L = L.__proto__;
}
}
複製代碼
Cat.prototype = new Animal();
瀏覽器
特色:babel
缺點:前端工程師
new Animal()
這樣的語句以後執行,不能放到構造器中function Cat(name){
Animal.call(this);
this.name = name || 'Tom';
}
複製代碼
特色:閉包
call
多個父類對象)缺點:
function Cat(name){
var instance = new Animal();
instance.name = name || 'Tom';
return instance;
}
複製代碼
特色:
new 子類()
仍是子類()
,返回的對象具備相同的效果缺點:
function Cat(name){
var animal = new Animal();
for(var p in animal){
Cat.prototype[p] = animal[p];
}
Cat.prototype.name = name || 'Tom';
}
複製代碼
特色:
缺點:
for in
訪問到)function Cat(name){
Animal.call(this);
this.name = name || 'Tom';
}
Cat.prototype = new Animal();
Cat.prototype.constructor = Cat;
複製代碼
特色:
缺點:
function Cat(name){
Animal.call(this);
this.name = name || 'Tom';
}
(function(){
// 建立一個沒有實例方法的類
var Super = function(){};
Super.prototype = Animal.prototype;
//將實例做爲子類的原型
Cat.prototype = new Super();
})();
Cat.prototype.constructor = Cat;
複製代碼
特色:
缺點:
class Cat extends Animals {}
特色:
缺點:
polyfill
Node
)中應用原型繼承的案例這個案例就不一一列舉了,感興趣的同窗能夠自行查閱開源項目源碼.
new
一個對象的詳細過程,手動實現一個new
操做符如下答案轉載自MDN - new 運算符:
new 運算符建立一個用戶定義的對象類型的實例或具備構造函數的內置對象的實例。new 關鍵字會進行以下的操做:
//本身定義的new方法
let newMethod = function (Parent, ...rest) {
// 1.以構造器的prototype屬性爲原型,建立新對象;
let child = Object.create(Parent.prototype);
// 2.將this和調用參數傳給構造器執行
Parent.apply(child, rest);
// 3.返回第一步的對象
return child;
};
複製代碼
es6 class
構造以及繼承的底層實現原理ES6類的底層仍是經過構造函數以及原型鏈繼承實現,具體實現能夠參考babel編譯成的es5代碼實現.
系列連接: