1. 程式人生 > 實用技巧 >原型prototype(功能類似於繼承)

原型prototype(功能類似於繼承)

原文連結:https://www.cnblogs.com/shihaiying/p/12031830.html

㈠原型 Prototype

⑴我們所建立的每一個函式,解析器都會向函式中新增一個屬性Prototype

這個屬性對應著一個物件,這個物件就是我們所謂的原型物件

⑵如果函式作為普通函式呼叫prototype沒有任何作用

當函式以建構函式的形式呼叫時,它所建立的物件中都會有一個隱含的屬性

指向該建構函式的原型物件,我們可以通過_ _prototype_ _來訪問

⑶示例:

function MyClass(){

}
var mc = new MyClass();
var mc2 = new MyClass();

console.log(mc2._ _prototype_ _ == MyClass._ _prototype_ _);

返回結果為:true;

原型物件就相當於一個公共的區域所有同一類的例項都可以訪問到這個原型物件

我們可以將物件中共有的內容,統一設定到原型物件中。

當我們訪問物件的一個屬性或方法時,它會先在物件自身中尋找,如果有則直接使用,

如果沒有則會去原型物件中尋找,如果找到則直接使用!important

⑹具體圖形演示:

示例1:

function MyClass(){

}
//向MyClass的原型中中新增a屬性
MyClass.prototype.a = 123; 

var mc = new MyClass();

var mc2 = new MyClass();

//向mc中新增a屬性
mc.a = "我是mc中的a";

console.log(mc.a);
console.log(mc2.a);
結果輸出:

示例2:

function MyClass(){

}
//向MyClass的原型中中新增a屬性
MyClass.prototype.a = 123; 

//向MyClass的原型中中新增一個方法
MyClass.prototype.sayHello = function(){
     alert("hello");
};
var mc = new MyClass(); 

var mc2 = new MyClass(); 

//向mc中新增a屬性  
mc.a = "我是mc中的a"; 

mc.sayHello();

結果顯示為:hello

⑺以後我們建立建構函式時,可以將這些物件共有屬性和方法,統一新增到建構函式的原型物件中,

這樣不用分別為每一個物件新增,也不會影響到全域性作用域,就可以使每個物件都具有這些屬性和方法了

㈡原型物件

function MyClass(){

}

//向MyClass的原型中新增一個name屬性
MyClass.prototype.name = "我是原型中的名字";

var mc = new MyClass();

console.log(mc.name);
結果返回:我是原型中的名字

⑴使用in檢查物件中是否含有某個屬性時,如果物件中沒有但是原型中有,也會返回true

console.log("name" in mc);

結果會返回:true

⑵可以使用物件的hasOwnPrototype( )來檢查物件自身是否含有該屬性

使用該方法只有當物件自身含有屬性時,才會返回true

console.log(mc.hasOwnPrototype("age"));

結果返回:true

console.log(mc.hasOwnPrototype("hasOwnProperty"));

結果返回:false

⑶原型物件也是物件,所以它也有原型

當我們使用一個物件的屬性或方法時,會先在自身中尋找

自身中如果有,則直接使用

如果沒有則去原型物件中尋找,如果原型物件中有,則使用

如果沒有則去原型的原型中尋找,直到找到Object物件的原型

Object物件的原型是沒有原型的。

如果在Object中依然沒有找到,則返回undefined

⑷具體圖形演示

  

⑸示例:

//在原型中查詢

console.log(mc._ _prototype_ _.hasOwnPrototype("hasOwnProperty"));

結果返回:false

//在原型的原型中查詢

console.log(mc._ _protot_ _._ _protot_ _.hasOwnPrototype("hasOwnProperty"));

結果返回:true

//在原型的原型的原型中查詢

console.log(mc._ _protot_ _._ _protot_ _._ _protot_ _);

結果返回:null