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
