愛奇藝 2020年2月13日
-
自我介紹
-
==
與===
-
call和apply
-
幾種繼承方式及優缺點
原型鏈繼承: 將父類的私有屬性和公有方法都作爲自己的公有屬性和方法,但無法實現多繼承,無法向父類構造函數傳參,父類所有屬性將被共享。
構造函數繼承: 解決了原型鏈繼承中子類實例共享父類引用屬性的問題,可以向父類傳遞參數,可以多繼承(call多個父類對象),但只能繼承父類的實例屬性和方法,不能繼承原型屬性和方法,
組合繼承: 通過調用父類構造,繼承父類的屬性並保留傳參的優點,然後通過將父類實例作爲子類原型,實現函數複用。需要修復構造函數指向,會調用兩次構造函數。 優化:通過父類原型和子類原型指向同一對象Fish.prototype = Animal.prototype
,子類可以繼承到父類的公有方法當做自己的公有方法,而且不會初始化兩次實例方法/屬性,但是沒辦法辨別是實例是子類還是父類創造的使用instanceof Fish/Animal
都返回true。
寄生繼承:在組合繼承的基礎上進行優化,Fish.prototype = Object.create(Animal.prototype)
,同樣的,需要修復構造函數指向。手動實現一個object.create Object.create = function (o) { var F = function () {}; F.prototype = o; return new F(); };
-
React組件傳值和數據共享
-
redux原理
-
數組排序(時間複雜度/空間複雜度):選擇排序,時間複雜度O(n^2),空間複雜度O(1)
const arr = [2, 1, 4, 3, 6, 5, 7, 0]; sort(arr); // [0, 1, 2, 3, 4, 5, 6, 7] function sort(arr) { for (var i = 0; i < arr.length; i++) { for (var j = i + 1; j < arr.length; j++) { if (arr[i] > arr[j]) { var temp = arr[j]; arr[j] = arr[i]; arr[i] = temp; } } } return arr }
-
函數執行結果(變體,如果getFullname改爲箭頭函數,則會是什麼結果。箭頭函數與普通函數的區別)
var fullname = 'John Doe'; var obj = { fullname: 'Colin Ihrig', prop: { fullname: 'Aurelio De Rosa', getFullname: function(){ return this.fullname; } } } console.log(obj.prop.getFullname()); // 'Aurelio De Rosa' var test = obj.prop.getFullname; console.log(test()); // 'John Doe';
-
寫一個繼承Animal的class/function,並在Animal的基礎上有自己的bark
function Animal(name, energy){ this.name = name; this.energy = energy; } Animal.prototype.eat = function(amount){ console.log(`${this.name} is eating`); this.energy += amount; } Animal.prototype.sleep = function(length){ console.log(`${this.name} is sleeping`); this.energy -= length; } A: function Fish(name, energy){ Animal.call(this, name, energy); } Fish.prototype = new Animal(); Fish.prototype.bark = function(){ console.log('this is bark'); }