js面試題知識點全解(一原型和原型鏈1)
1.如何準確判斷一個變數是陣列型別
2.寫一個原型鏈繼承的例子
3.描述new一個物件的過程
4.zepto(或其他框架)原始碼中如何使用原型鏈
知識點:
1.建構函式
2.建構函式-擴充套件
3.原型規則和示例
4.原型鏈
5.instanceof
講解:
建構函式:一般函式為大寫字母開頭的都是建構函式,如下:
function Foo(name,age){ this.name=name this.age=age //return this }
var f = new Foo('L',20) ; //建構函式形成例項,可以建立多個物件;f是一個空物件,原型是Foo
var a={}其實是var a=new Object()的語法糖
var a=[]其實是var a=new Array()的語法糖
function Foo(){}其實是var Foo=new Function()
instanceof用於判斷引用型別屬於哪個建構函式的方法
f instanceof Foo //判斷f這個引用型別是否屬於Foo建構函式,判斷邏輯:f的_proto_一層一層往上,能否對應到Foo.prototype
判斷一個變數是否為"陣列":變數名 instanceof Array,如下程式碼:
var arr=[]; arr instanceof Array //true typeof arr //object, typeof是無法判斷是否是陣列的
原型規則和示例:
1.所有的引用型別(陣列、物件、函式),都具有物件特性,即可自由擴充套件屬性(除了"null"物件以外)
2.所有引用型別都有一個_proto_(隱式原型)屬性,屬性值是一個普通的物件
3.所有函式都有一個prototype(顯示原型)屬性,屬性值也是一個普通物件
var obj={}; obj.a=100; function fn(){} fn.a=100; console.log(obj._proto_); //隱式原型,都具有可擴充套件屬性原則 console.log(fn.prototype); //顯示原型
4.所有的引用型別,_proto_屬性值指向它的建構函式的"prototype"屬性值
console.log(obj._proto_===Object.prototype) //obj的建構函式為new Object(),所以obj的隱式原型屬性就指向Object的顯示原型屬性
5.當試圖得到一個物件的某個屬性時,如果這個物件本身沒有這個屬性,那麼它會去它的_proto_(即它的建構函式的prototype)中尋找
1 //建構函式 2 function Foo(name,age){ 3 this.name = name 4 } 5 Foo.prototype.alertName= function(){ 6 alert(this.name+"killua"); 7 } 8 //建立示例 9 var f = new Foo("L"); 10 f.lastName = function(){ 11 console.log(this.name) 12 } 13 f.lastName(); //"L",自身屬性 14 f.alertName(); //"Lkillua",原型屬性 15 //以上函式中,f共有3個屬性,f自身的屬性有2個(name屬性和lastName屬性),還有一個alertName是原型屬性 16 f.firstName();//這裡f自身屬性中沒有firstName屬性,它的原型Foo函式中也麼有這個屬性,所以要再往上一層Foo的原型上去找這個屬性,這種有多層原型的函式就是原型鏈,直到null為止結束原型鏈 17 var item; 18 for(item in f){ 19 // 高階瀏覽器已經在 for in 中遮蔽了來自原型的屬性,但是這裡建議加上這個判斷,保證程式的健壯性 20 if(f.hasOwnProperty(item)){ //迴圈遍歷f函式,如果f函式有它自身的屬性item,則列印出item屬性 21 console.log(item) 22 } 23 }
寫一個原型鏈繼承的例子:
簡單易懂的例子:
1 function Name(){ 2 this.name=function(){ 3 console.log("killua") 4 } 5 } 6 function Firstname(){ 7 this.firstname=function(){ 8 console.log("L") 9 } 10 } 11 Name.prototype = new Firstname(); 12 var he = new Name(); 13 console.log(he.name); //"killua" 14 console.log(he.firstname); //"L"
稍複雜點的例子(建議面試用):
1 function Elem(id){ 2 this.elem = document.getElementById(id) 3 } 4 Elem.prototype.html = function(val){ 5 var elem = this.elem 6 if(val){ 7 elem.innerHTML = val 8 return this //鏈式操作 9 }else{ 10 return elem.innerHTML 11 } 12 } 13 Elem.prototype.on = function(type, fn){ 14 var elem = this.elem 15 elem.addEventListener(type, fn) //addEventListener() 方法用於向指定元素新增事件控制程式碼 16 } 17 var div1 = new Elem('div1') 18 //console.log(div1.html()) 19 div1.html('<p>hello killua</p>').on('click',function(){ 20 alert('clicked') 21 }).html('<p>javascript</p>')
相關文章
- 【重點】圖解:告訴面試官什麼是 JS 原型和原型鏈?圖解面試JS原型
- 面試題之原型、原型鏈、和繼承面試題原型繼承
- 重新認識原型和原型鏈一原型
- JS原型和原型鏈JS原型
- 深入學習js之——原型和原型鏈#1JS原型
- 面試之JS篇 - 原型與原型鏈面試JS原型
- 【前端面試】原型和原型鏈前端面試原型
- js--原型和原型鏈相關問題JS原型
- js難點精解-----原型和原型鏈的關係和應用JS原型
- JS原型與原型鏈圖解JS原型圖解
- ? 圖解原型和原型鏈圖解原型
- 圖解原型和原型鏈圖解原型
- 重新認識原型和原型鏈三原型
- 重新認識原型和原型鏈二原型
- 前端面試題10----原型、原型鏈前端面試題原型
- javascript原型和原型鏈詳解JavaScript原型
- 這些js原型及原型鏈面試題你能做對幾道JS原型面試題
- JS 原型與原型鏈JS原型
- js原型及原型鏈JS原型
- JS原型與原型鏈JS原型
- 前端開發:JS中原型和原型鏈的詳解前端JS原型
- 原型和原型鏈原型
- js原型鏈圖解JS原型圖解
- js 原型鏈詳解JS原型
- 巧解 JS 原型鏈JS原型
- JS 中原型和原型鏈深入理解JS原型
- 原生js的三座大山之原型和原型鏈(1)JS原型
- JS原型鏈、prototype、__proto__、原型鏈繼承詳解JS原型繼承
- 2019 面試準備 - JS 原型與原型鏈面試JS原型
- 理解js中的原型,原型物件,原型鏈JS原型物件
- 原型和原型鏈梳理原型
- 理解原型和原型鏈原型
- 說說JS中的原型物件和原型鏈JS原型物件
- js總結(原型和原型鏈,閉包等)JS原型
- js原型鏈JS原型
- JS 原型鏈JS原型
- js原型鏈汙染詳解JS原型
- JS中的原型與原型鏈JS原型