js中的类、继承、闭包
一、js中的類
類:在面向對象編程中,類(class)是對象(object)的模板,定義了同一組對象(又稱"實例")共有的屬性和方法。
? ? ? ? ? Javascript是一種基于對象(object-based)的語言,你遇到的所有東西幾乎都是對象。但是,它又不是一種真正的面向對象編程(OOP)語言,因為它的語法中沒有class(類)。但是可以用一些變通的方法,模擬出"類"。
參考阮一峰老師的定義類的三種方法
Javascript定義類(class)的三種方法
一、構造函數法
這是經典方法,也是教科書必教的方法。它用構造函數模擬"類",在其內部用this關鍵字指代實例對象。
function Cat() {
this.name = "大毛";
}
? ? ? ?生成實例的時候,使用new關鍵字。
var cat1 = new Cat();
alert(cat1.name); // 大毛
? ? ? 類的屬性和方法,還可以定義在構造函數的prototype對象之上。
Cat.prototype.makeSound = function(){
alert("喵喵喵");
}
它用構造函數模擬"類",在其內部用this關鍵字指代實例對象。
function Cat() {
this.name = "大毛";
}
生成實例的時候,使用new關鍵字。
var cat1 = new Cat();
alert(cat1.name); // 大毛
二、Object.create()法
為了解決"構造函數法"的缺點,更方便地生成對象,Javascript的國際標準ECMAScript第五版(目前通行的是第三版),提出了一個新的方法Object.create()。
用這個方法,"類"就是一個對象,不是函數。
var Cat = {
name: "大毛",
makeSound: function(){ alert("喵喵喵"); }
};
然后,直接用Object.create()生成實例,不需要用到new。
var cat1 = Object.create(Cat);
alert(cat1.name); // 大毛
cat1.makeSound(); // 喵喵喵
目前,各大瀏覽器的最新版本(包括IE9)都部署了這個方法。如果遇到老式瀏覽器,可以用下面的代碼自行部署。
if (!Object.create) {
Object.create = function (o) {
function F() {}
F.prototype = o;
return new F();
};
}
這種方法比"構造函數法"簡單,但是不能實現私有屬性和私有方法,實例對象之間也不能共享數據,對"類"的模擬不夠全面。
三、極簡主義法
荷蘭程序員Gabor de Mooij提出了一種比Object.create()更好的新方法,他稱這種方法為"極簡主義法"(minimalist approach)。這也是我推薦的方法。
3.1 封裝
這種方法不使用this和prototype,代碼部署起來非常簡單,這大概也是它被叫做"極簡主義法"的原因。
首先,它也是用一個對象模擬"類"。在這個類里面,定義一個構造函數createNew(),用來生成實例。
var Cat = {
createNew: function(){
// some code here
}
};
然后,在createNew()里面,定義一個實例對象,把這個實例對象作為返回值。
var Cat = {
createNew: function(){
var cat = {};
cat.name = "大毛";
cat.makeSound = function(){ alert("喵喵喵"); };
return cat;
}
};
使用的時候,調用createNew()方法,就可以得到實例對象。
var cat1 = Cat.createNew();
cat1.makeSound(); // 喵喵喵
這種方法的好處是,容易理解,結構清晰優雅,符合傳統的"面向對象編程"的構造,因此可以方便地部署下面的特性。
3.2 繼承
讓一個類繼承另一個類,實現起來很方便。只要在前者的createNew()方法中,調用后者的createNew()方法即可。
先定義一個Animal類。
var Animal = {
createNew: function(){
var animal = {};
animal.sleep = function(){ alert("睡懶覺"); };
return animal;
}
};
然后,在Cat的createNew()方法中,調用Animal的createNew()方法。
var Cat = {
createNew: function(){
var cat = Animal.createNew();
cat.name = "大毛";
cat.makeSound = function(){ alert("喵喵喵"); };
return cat;
}
};
這樣得到的Cat實例,就會同時繼承Cat類和Animal類。
var cat1 = Cat.createNew();
cat1.sleep(); // 睡懶覺
3.3 私有屬性和私有方法
在createNew()方法中,只要不是定義在cat對象上的方法和屬性,都是私有的。
var Cat = {
createNew: function(){
var cat = {};
var sound = "喵喵喵";
cat.makeSound = function(){ alert(sound); };
return cat;
}
};
上例的內部變量sound,外部無法讀取,只有通過cat的公有方法makeSound()來讀取。
var cat1 = Cat.createNew();
alert(cat1.sound);?// undefined
3.4 數據共享
有時候,我們需要所有實例對象,能夠讀寫同一項內部數據。這個時候,只要把這個內部數據,封裝在類對象的里面、createNew()方法的外面即可。
var Cat = {
sound : "喵喵喵",
createNew: function(){
var cat = {};
cat.makeSound = function(){ alert(Cat.sound); };
cat.changeSound = function(x){ Cat.sound = x; };
return cat;
}
};
然后,生成兩個實例對象:
var cat1 = Cat.createNew();
var cat2 = Cat.createNew();
cat1.makeSound(); // 喵喵喵
這時,如果有一個實例對象,修改了共享的數據,另一個實例對象也會受到影響。
cat2.changeSound("啦啦啦");
cat1.makeSound(); // 啦啦啦
js中的繼承
在 javaScript 中,每個對象都有一個指向它的原型(prototype)對象的內部鏈接。(使用構造函數法模擬類 函數仍是 對象)這個原型對象又有自己的原型,直到某個對象的原型為null 為止(也就是不再有原型指向),組成這條鏈的最后一環。這種一級一級的鏈結構就稱為原型鏈.
利用prototype來實現繼承
定義一個Person類
function Person(){this.sayHello = function(){ alert("helloworld"); } } Person.prototype.setName=function(name){ this.name = name; } Person.prototype.getName=function(){ return this.name; } var p = new Person(); p.sayHello(); p.setName("wang"); alert(p.getName());現在我們定義一個Student類來繼續Person類:
function Student(){} Student.prototype = new Person(); var s = new Student(); s.sayHello(); s.setName("xi"); alert(s.getName());這樣Student類即繼承了Person類。
使用javaScript的閉包來完成繼承:
1.什么是js的閉包
js閉包Demo:
function A(){ function B(){ alert("Hello Closure!"); } return B; } var b = A(); b();//Hello Closure!這是史上最簡單的閉包,不能再簡單了,再簡單就不是閉包了!B為在函數內部定義的函數,用A函數返回,并用b來接收,也就是說在函數內部定義的函數,在外部使用,這種現象為閉包,所以繼承的封裝是閉包的一種應用。
2.閉包的作用
avascript中的GC機制:在javascript中,如果一個對象不再被引用,那么這個對象就會被GC回收,否則這個對象一直會保存在內存中。
在上述例子中,B定義在A中,因此B依賴于A,而外部變量b又引用了B, 所以A間接的被b引用,也就是說,A不會被GC回收,會一直保存在內存中。?
這就是閉包的作用,有時候我們需要一個模塊中定義這樣一個變量:希望這個變量一直保存在內存中但又不會“污染”全局的變量,這個時候,我們就可以用閉包來定義這個模塊。
轉載于:https://www.cnblogs.com/zhangxintong1314/p/6508788.html
總結
以上是生活随笔為你收集整理的js中的类、继承、闭包的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python-基础-时间日期处理小结
- 下一篇: passwd命令提示: 鉴定令牌操作错误