ECMAScript有兩種開發模式:函數
1.函數式(過程化)測試
2.面向對象(OOP)。this
面向對象的語言有一個標誌,那就是類的概念,而經過類能夠建立任意多個具備相同屬性和方法的對象。可是,ECMAScript沒有類的概念,所以它的對象也與基於類的語言中的對象有所不一樣。spa
建立對象prototype
建立一個對象,而後給這個對象新建屬性和方法。對象
方法一:基本寫法ip
var box = new Object(); //建立一個 Object對象作用域
box.name = 'Lee';//建立一個 name屬性並賦值開發
box.age = 100;//建立一個 age屬性並賦值原型
box.run = function () {//建立一個 run()方法並返回值
return this.name + this.age + '運行中...';
};
缺點,不能公用,想建立一個相似的對象,就會產生大量的代碼。
方法二:工廠模式的方法
function createObject(name, age) { //集中實例化的函數
var obj = new Object();
obj.name = name;
obj.age = age;
obj.run = function () {
return this.name + this.age + '運行中...';
};
return obj;
}
var box1 = createObject('Lee', 100);//第一個實例
var box2 =createObject('Jack',200);//第二個實例
alert(box1.run()); //Lee100運行中...
alert(box2.run()); //Jack200運行中...
工廠模式解決了重複實例化的問題,但還有一個問題,那就是識別問題,由於根本沒法搞清楚他們究竟是哪一個對象的實例。
方法三:構造函數(構造方法)
function Box(name, age) {//構造函數模式
this.name = name;
this.age = age;
this.run = function () {
return this.name + this.age + '運行中...';
};
}
var box1 = new Box('Lee', 100);
var box2 = new Box('Jack',200);
alert(box1.run());
alert(box1 instanceof Box); //很清晰的識別他從屬於 Box
使用構造函數的方法,即解決了重複實例化的問題,又解決了對象識別的問題
構造函數的方法和工廠模式的方法有何不一樣之處?
1.構造函數方法沒有顯式的建立對象(new Object());
2.直接將屬性和方法賦值給 this 對象;
3.沒有 return 語句。
構造函數的方法有一些規範:
1.函數名和實例化構造名相同且大寫,(PS:非強制,但這麼寫有助於區分構造函數和普通函數);
2.經過構造函數建立對象,必須使用 new 運算符。
既然經過構造函數能夠建立對象,那麼這個對象是哪裏來的,new Object()在什麼地方執行了?
執行的過程以下:
1.當使用了構造函數,而且 new 構造函數(),那麼就後臺執行了 new Object();
2.將構造函數的做用域給新對象,(即 new Object()建立出的對象),而函數體內的 this 就表明 new Object()出來的對象。
3.執行構造函數內的代碼;
4.返回新對象(後臺直接返回)。
構造函數和普通函數的惟一區別,就是他們調用的方式不一樣。只不過,構造函數也是函數,必須用 new 運算符來調用,不然就是普通函數。
判斷一個對象是否指向了該構造函數的原型對象,可使用 isPrototypeOf()方法來測試。
alert(Box.prototype.isPrototypeOf(box)); //只要實例化對象,即都會指向