js里的面向对象分析-(创建实例化对象)
ECMAScript 有兩種開發模式:1.函數式(過程化),2.面向對象(OOP)。面向對象的語言有一個標志,那就是類的概念,而通過類可以創建任意多個具有相同屬性和方法的對象。但是,ECMAScript 沒有類的概念,因此它的對象也與基于類的語言中的對象有所不同。
js本身是沒有class類型的,但是每個函數都有一個prototype屬性。prototype指向一個對象,當函數作為構造函數時,prototype則起到類似class的作用。
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 對象本身。但是有個缺點就是不能實例化多個具有相似屬性和方法的對象。于是我們想到了可不可以有一套模板來批量制作對象。于是就有了-工廠模式。看下面例子
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()); //保持獨立這種方法雖然制造出來了一套模板來規范待實例化的對象。但是還有許多問題,比如創建不同對象其中屬性和方法都會重復建立,消耗內存,還有函數識別問題等等。其實還有更優秀的也是用的最多的方法,看下面示例。
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 運算符。
構造函數可以創建對象執行的過程:
1)當使用了構造函數,并且new 構造函數(),那么就后臺執行了new Object();
2)將構造函數的作用域給新對象,(即new Object()創建出的對象),而函數體內的this 就
代表new Object()出來的對象。
3)執行構造函數內的代碼;
4)返回新對象(后臺直接返回)。
注:
1)構造函數和普通函數的唯一區別,就是他們調用的方式不同。只不過,構造函數也是函數,必須用new 運算符來調用,否則就是普通函數。
2)this就是代表當前作用域對象的引用。如果在全局范圍this 就代表window 對象,如果在構造函數體內,就代表當前的構造函數所聲明的對象。
?
這種方法解決了函數識別問題,但消耗內存問題沒有解決。同時又帶來了一個新的問題,全局中的this 在對象調用的時候是Box 本身,而當作普通函數調用的時候,this 又代表window。即this作用域的問題。
轉載于:https://www.cnblogs.com/coolzone/p/6589090.html
總結
以上是生活随笔為你收集整理的js里的面向对象分析-(创建实例化对象)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Build Provider 不得不说的
- 下一篇: docker 部分常用镜像下载及安装