面向對象的語言有一個標誌,那就是他們都有類的概念,通過類可以創建任意多個具有相同屬性和方法的對象。但是在ECMAScript中沒有類的概念(這裏不涉及ES6),但是我們可以通過其他方式來模擬面向對象的類。
面嚮對象語言中類的概念:
var obj = new Object(); // var obj = {};
obj.name = 'z3';
obj.sex = '男';
obj.sayName = function(){alert('我是張三!')};
如何通過類來創建實例對象,這裏有兩種簡單方式:
工廠模式
function createPerson(name , sex , age){ var obj = new Object(); obj.name = name ; obj.sex = sex ; obj.age = age ; obj.sayName = function(){ alert(this.name); } return obj; } var p1 = createPerson('z3' , '男' , 20); var p2 = createPerson('z4' , '女' , 25); //alert(p1.sex); p1.sayName();
構造函數的方式
// 函數的第一個字母大寫 (類的模版) function Person(name , age , sex){ this.name = name ; this.age = age ; this.sex = sex ; this.sayName = function(){ alert(this.name); } } //構造一個對象 new關鍵字 傳遞參數 執行模版代碼 返回對象 var p1 = new Person('小1' , 20 , '男'); var p2 = new Person('小2' , 21 , '女'); //alert(p1.name); //p1.sayName(); //alert(p1 == p2); //false 類的概念:根據模版創建出不同的實例對象 //alert(p1.constructor == Person); //true //alert(p2.constructor == Person); //true alert(p1 instanceof Person); //true alert(p1 instanceof Object); //true
創建對象的幾種方式:
當做構造函數去使用
var p1 = new Person('小1' , 20 , '男');
作爲普通的函數去調用
//在全局環境裏定義屬性並賦值,Person裏的this永遠指向調用該函數的對象,也就是全局window中的變量 Person('小2' , 25 , '男');
在另一個對象的作用域中調用
var o = new Object(); // call applly Person.call(o,'小4' , 12 , '女');