js裏的面向對象分析-(建立實例化對象)

ECMAScript 有兩種開發模式:1.函數式(過程化),2.面向對象(OOP)。面向對象的語言有一個標誌,那就是類的概念,而經過類能夠建立任意多個具備相同屬性和方法的對象。可是,ECMAScript 沒有類的概念,所以它的對象也與基於類的語言中的對象有所不一樣。函數

js自己是沒有class類型的,可是每一個函數都有一個prototype屬性。prototype指向一個對象,當函數做爲構造函數時,prototype則起到相似class的做用。this

var box = new Object(); //建立一個Object 對象
box.name = 'Lee'; //建立一個name 屬性並賦值
box.age = 100; //建立一個age 屬性並賦值
box.run = function () { //建立一個run()方法並返回值
return this.name + this.age + '運行中...';
};
alert(box.run()); //輸出屬性和方法的值

上面建立了一個對象,而且建立屬性和方法,而且實例化該對象,最後調用對象的方法。在run()方法裏的this,就是表明box 對象自己。可是有個缺點就是不能實例化多個具備類似屬性和方法的對象。因而咱們想到了可不能夠有一套模板來批量製做對象。因而就有了-工廠模式。看下面例子spa

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());
alert(box2.run()); //保持獨立

這種方法雖然製造出來了一套模板來規範待實例化的對象。可是還有許多問題,好比建立不一樣對象其中屬性和方法都會重複創建,消耗內存,還有函數識別問題等等。其實還有更優秀的也是用的最多的方法,看下面示例。prototype

function Box(name, age) { //構造函數模式
this.name = name;
this.age = age;
this.run = function () {
return this.name + this.age + '運行中...';
};
}
var box1 = new Box('Lee', 100); //new Box()便可
var box2 = new Box('Jack', 200);
alert(box1.run());
alert(box1 instanceof Box); //很清晰的識別他從屬於Box

這個方法看似像一個函數,但又有些不太同樣。好比函數名通常都小寫。若是學過其餘面向對象的語言就會知道,這是類的寫法(此處很少分析,非強制,但這麼寫有助於區分構造函數和
普通函數)。這種方法是構造函數建立對象的寫法,經過構造函數建立對象,必須使用new 運算符。code

構造函數能夠建立對象執行的過程:對象


1)當使用了構造函數,而且new 構造函數(),那麼就後臺執行了new Object();
2)將構造函數的做用域給新對象,(即new Object()建立出的對象),而函數體內的this 就
表明new Object()出來的對象。
3)執行構造函數內的代碼;
4)返回新對象(後臺直接返回)。blog

注:ip

1)構造函數和普通函數的惟一區別,就是他們調用的方式不一樣。只不過,構造函數也是函數,必須用new 運算符來調用,不然就是普通函數。內存

2)this就是表明當前做用域對象的引用。若是在全局範圍this 就表明window 對象,若是在構造函數體內,就表明當前的構造函數所聲明的對象。作用域

 

這種方法解決了函數識別問題,但消耗內存問題沒有解決。同時又帶來了一個新的問題,全局中的this 在對象調用的時候是Box 自己,而看成普通函數調用的時候,this 又表明window。即this做用域的問題。

相關文章
相關標籤/搜索