如果建構函式或物件a的原型指向建構函式或物件b,b的原型再指向建構函式或物件c,以此類推,最終的建構函式或物件的原型指向object的原型。由此形成了一條鏈狀結構,被稱之為原型鏈。按照上述的描述,在b中定義的屬性或方法,可以在a中使用並不需要定義。這就是繼承,它允許每個物件來訪問其原型鏈上的任何屬性或方法。在js語言中,原型鏈是繼承的預設產生方式。
//原型鏈
function a()
//通過建構函式建立物件
var a = new a();
function b()
//將b的原型指向a
b.prototype = a ;
var b =new b();
console .log(b.a);//a
console .log(b.b);//b
function c()
//將c的原型指向b
c.prototype = b;
var c= new c();
/*console .log(物件.屬性)*/
console .log(c.c);//c
console .log(c.b);//b
console .log(c.a);//a
出於對效率的考慮,盡可能地將屬性和方法加到原型上,可以採用以下方式:
1.不要為繼承關係單獨建立新物件。
2.儘量減少執行時的方法搜尋。
//原型鏈
function a()
a.prototype.a='a';//將自有屬性改寫為原型屬性
function b()
b.prototype=a.prototype; //將b的原型屬性指向a的原型屬性
b.prototype.b = 'b';
function c()
c.prototype = b.prototype;
var c = new c;
console .log(c.c);
console .log(c.b);
console .log(c.a);
原型鏈雖然強大,用它可以實現js中的繼承,但同時也存在一些問題。
1.原型鏈實際上是在多個建構函式或物件之間共享屬性和方法。
2.建立子類的物件時,不能向父級的建構函式傳遞任何引數。
所以,在實際開發中,很少會單獨使用原型鏈。
所謂原型式繼承,就是定義乙個函式,該函式中建立乙個歷史性的建構函式,將作為引數傳入的物件作為這個建構函式的原型,最後返回這個建構函式的實現物件。
/*
定義乙個函式 - 用於實現物件之間的繼承
* 引數
* obj - 表示繼承關係中的父級物件
* prop - 物件格式,表示繼承關係中的子級物件的屬性和方法
*/function fn(obj, porp)
}// 將函式的引數作為建構函式的原型
fun.prototype = obj;
// 將建構函式建立的物件進行返回
return new fun();
}var obj =
// 呼叫函式
var result = fn(obj,
});console.log(result.age);
result.sayme();
var obj =
var newobj = object.create(obj, ,
sayme :
}});console.log(newobj.age);
newobj.sayme();
在子級中呼叫父級元素的屬性
// 定義父級物件的建構函式
function parent()
// 定義子級物件的建構函式
function child()
// 建立子級物件
var child = new child();
console.log(child);
學習第十天
一 介面 jdk1.8及之後新增了2中可以定義存在方法體的方法 預設方法 default關鍵字修飾的方法 使用 通過實現類物件使用 靜態方法 使用 通過介面名去呼叫 二 單例模式 保證類只能存在乙個例項 餓漢式 先建立物件,然後需要的人要這個物件,保證永遠使用的都是這個建立好的物件 執行緒安全的,效...
python學習第十天
class student count 0 def init self,name,age,address self.name name self.age age self.address address student.count 1 k print k w open a.txt w encodin...
菜鳥學習第十天
1.字串最大的特點 一旦初始化就不可以改變。不可改變的字串內容而不是指向字串的引用 2.string s abc 其中s是乙個類型別變數,abc 是乙個物件。3.string s1 abc 和string s2 new string abc s1 s2 和s1.equals s2 比較的是他們在記憶...