我們知道,在js中,是沒有類的概念的。類的所有實例對象都從同一個原型對象上繼承屬性,因此,原型對象是類的核心。
類是對象的抽象,而對象是類的具體實例。類是抽象的,不占用內存,而對象是具體的,占用存儲空間。———百度百科
早期的javascript需求都很簡單,基本都是寫成函數的,然後是面向過程的寫法,後來慢慢的引入面向對象開發思想,再後來就慢慢寫成類。
在js中,寫成類的本質基本都是 構造函數+原型。下面,就討論一下js類的幾種寫法:
構造函數法
/**
* Person類:定義一個人,有name屬性和getName方法
*/
<script>
function Person(name){
this.name = name;
this.getName = function(){
return this.name;
}
}
//我們在這裡實例化幾個對象
var p1 = new Person("trigkit4");
var p2 = new Person("mike");
console.log(p1 instanceof Person);//true
console.log(p2 instanceof Person);//true
</script>
由上面控制台輸出結果可知,p1和p2的確是類Person的實例對象。instanceof操作符左邊是待檢測類的對象,右邊是定義類的構造函數。這裡,instanceof用來檢測對象p1是否屬於Person類。
這種方式的優點是:我們可以根據參數來構造不同的對象實例 ,缺點是每次構造實例對象時都會生成getName方法,造成了內存的浪費 。
我們可以用一個外部函數來代替類方法,達到了每個對象共享同一個方法。改寫後的類如下:
//外部函數
<script>
function getName() {
return this.name;
}
function Person(name){
this.name = name;
this.getName = getName;//
}
</script>
原型方式
<script>
function Person(){};
Person.prototype.name = "trigkit4";//類的屬性都放在prototype上
Person.prototype.getName = function(){
return " I'm " + this.name;
}
var p1 = new Person();
var p2 = new Person();
console.log(p1.name);//trigkit4
console.log(p2.getName());//I'm trigkit4
</script>
原型方式的缺點就是不能通過參數來構造對象實例 (一般每個對象的屬性是不相同的) ,優點是所有對象實例都共享getName方法(相對於構造函數方式),沒有造成內存浪費 。
構造函數+原型方式
取前面兩種的優點:
a、用構造函數來定義類屬性(字段)。
b、用原型方式來定義類的方法。
<script>
function Person(name){
this.name = name;
}
//原型的特性可以讓對象實例共享getName方法
Person.prototype.getName = function(){
return " I'm " + this.name;
}
</script>
這樣,我們就既可以構造不同屬性的對象,也可以讓對象實例共享方法,不會造成內存的浪費。
為了讓js代碼風格更緊湊,我們讓prototype方法代碼移到function Person的大括號內。
<script>
function Person(name){
this.name = name;
Person.prototype.getName = function(){
return name;//不宜用this.name
}
}
var p1 = new Person('trigkit4');
console.log(p1.getName());//trigkit4
</script>
在這裡,我們需要知道的幾種定義類的方法,除了上面的構造函數外,還有:
Object.create()方法
用這個方法,"類"就是一個對象,而不是函數。
var Person = {
name : "trigkit4",
age : 21,
run: function(){
alert("I like running");
}
}
然後,直接用Object.create()生成實例,不需要用到new。
var p1 = Object.create(Person); alert(p1.age);//21 p1.run();//I like running
這種方法比"構造函數法"簡單,但是不能實現私有屬性和私有方法,實例對象之間也不能共享數據,對"類"的模擬不夠全面。
createNew()方法
這種方法不需要用到this和prototype,其做法是用對象來模擬一個類,然後在類裡面定義一個構造函數createNew(),然後在createNew()裡面定義實例對象,把這個實例對象作為返回值。
<script>
var Person = {
createNew : function () {
var person = {};
person.name = "trigkit4";
person.run = function(){
alert("I like running");
};
return person;
}
}
</script>
使用的時候,調用createNew()方法,就可以得到實例對象。
var p1 = Person.createNew(); p1.run();//I like running
這種寫法其實和對象字面量的寫法是很類似的,只不過一個是逗號分隔,一個是分號分隔。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持。