web前端面試之js繼承與原型鏈(碼動未來)

web前端面試之js繼承與原型鏈(碼動未來)

3.2.1、JavaScript原型,原型鏈 ? 有什么特點?

每個對象都會在其內(nèi)部初始化一個屬性,就是prototype(原型),當(dāng)我們訪問一個對象的屬性時,如果這個對象內(nèi)部不存在這個屬性,那么他就會去prototype里找這個屬性,這個prototype又會有自己的prototype,于是就這樣一直找下去,也就是我們平時所說的原型鏈的概念。

關(guān)系:instance.constructor.prototype = instance.__proto__

特點:JavaScript對象是通過引用來傳遞的,我們創(chuàng)建的每個新對象實體中并沒有一份屬于自己的原型副本。當(dāng)我們修改原型時,與之相關(guān)的對象也會繼承這一改變。

當(dāng)我們需要一個屬性的時,Javascript引擎會先看當(dāng)前對象中是否有這個屬性, 如果沒有的話,就會查找他的Prototype對象是否有這個屬性,如此遞推下去,一直檢索到 Object 內(nèi)建對象。

????function Func(){}

??? ????Func.prototype.name = "Sean";

????Func.prototype.getInfo = function() {

??????return this.name;

??? ?}

var person = new Func();//現(xiàn)在可以參考var person = Object.create(oldObject);

??? console.log(person.getInfo());//它擁有了Func的屬性和方法//"Sean"

??? ?console.log(Func.prototype);// Func { name="Sean", getInfo=function()}


3.2.2、Javascript如何實現(xiàn)繼承?

1、構(gòu)造繼承

2、原型繼承

3、實例繼承

4、拷貝繼承

原型prototype機制或apply和call方法去實現(xiàn)較簡單,建議使用構(gòu)造函數(shù)與原型混合方式。

??????? ?function Parent(){

?????????? ??this.name = 'wang';

????????}

??? ?????function Child(){

??????? ?????this.age = 28;

????????}

??? Child.prototype = new Parent();//繼承了Parent,通過原型

??????? ?var demo = new Child();

????????alert(demo.age);

??? alert(demo.name);//得到被繼承的屬性


3.2.3、JavaScript繼承的幾種實現(xiàn)方式?

參考:構(gòu)造函數(shù)的繼承http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance.html,

非構(gòu)造函數(shù)的繼承http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance_continued.html;


3.2.4、javascript創(chuàng)建對象的幾種方式?

javascript創(chuàng)建對象簡單的說,無非就是使用內(nèi)置對象或各種自定義對象,當(dāng)然還可以用JSON;但寫法有很多種,也能混合使用。

1、對象字面量的方式 ??

????person={firstname:"Mark",lastname:"Yun",age:25,eyecolor:"black"};

2、用function來模擬無參的構(gòu)造函數(shù)

????function Person(){}

var person=new Person();//定義一個function,如果使用new"實例化",該function可以看作是一個Class

????person.name="Mark";

????person.age="25";

????person.work=function(){

????alert(person.name+" hello...");

????}

????person.work();

3、用function來模擬參構(gòu)造函數(shù)來實現(xiàn)(用this關(guān)鍵字定義構(gòu)造的上下文屬性)

????function Pet(name,age,hobby){

??????? this.name=name;//this作用域:當(dāng)前對象

???????this.age=age;

???????this.hobby=hobby;

???????this.eat=function(){

??????? alert("我叫"+this.name+",我喜歡"+this.hobby+",是個程序員");

??? ????}

????}

var maidou =new Pet("麥兜",25,"coding");//實例化、創(chuàng)建對象

maidou.eat();//調(diào)用eat方法

4、用工廠方式來創(chuàng)建(內(nèi)置對象)

?????var wcDog =new Object();

??? wcDog.name="旺財";

?????wcDog.age=3;

?????wcDog.work=function(){

alert("我是"+wcDog.name+",汪汪汪......");

????? }

?????wcDog.work();

5、用原型方式來創(chuàng)建

????function Dog(){ ????}

Dog.prototype.name="旺財";

?????Dog.prototype.eat=function(){

alert(this.name+"是個吃貨");

?????}

?????var wangcai =new Dog();

?????wangcai.eat();

6、用混合方式來創(chuàng)建

????function Car(name,price){

??????this.name=name;

??????this.price=price;

????}

?????Car.prototype.sell=function(){

alert("我是"+this.name+",我現(xiàn)在賣"+this.price+"萬元");

??????}

var camry =new Car("凱美瑞",27);

????camry.sell();


3.2.5、Javascript中,有一個函數(shù),執(zhí)行時對象查找時,永遠不會去查找原型,這個函數(shù)是?

hasOwnProperty

javaScript中hasOwnProperty函數(shù)方法是返回一個布爾值,指出一個對象是否具有指定名稱的屬性。此方法無法檢查該對象的原型鏈中是否具有該屬性;該屬性必須是對象本身的一個成員。

使用方法:

object.hasOwnProperty(proName)

其中參數(shù)object是必選項。一個對象的實例。

proName是必選項。一個屬性名稱的字符串值。

如果object具有指定名稱的屬性,那么JavaScript中hasOwnProperty函數(shù)方法返回 true,反之則返回 false。


3.2.6、談?wù)凾his對象的理解。

this總是指向函數(shù)的直接調(diào)用者(而非間接調(diào)用者);如果有new關(guān)鍵字,this指向new出來的那個對象;在事件中,this指向觸發(fā)這個事件的對象,特殊的是,IE中的attachEvent中的this總是指向全局對象Window;


3.2.7、new操作符具體干了什么呢?

(1)創(chuàng)建一個空對象,并且 this 變量引用該對象,同時還繼承了該函數(shù)的原型。

(2)屬性和方法被加入到 this 引用的對象中。

(3)新創(chuàng)建的對象由 this 所引用,并且最后隱式的返回 this 。

QQ技術(shù)交流群:815302226



?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容