js面向對象概念解析

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));            //只要實例化對象,即都會指向

相關文章
相關標籤/搜索